如何使用从某一行开始的stdin文件创建python子进程?



我试着做下面的事情来打印3和4:

input.txt

1
2
3
4

program1.py

import subprocess
inputfile = open('input.txt', 'r')
inputfile.readline()
inputfile.readline()
subprocess.call('python program2.py',stdin=inputfile)
inputfile.close()

program2.py

while True:
    print raw_input() 

它将不打印任何内容。但是如果我去掉readlines(),它会打印1到4。

我如何使用一个文件在某一行开始为一个子进程的标准输入?

您可以使用Popen().communicate()代替call()。我不完全确定为什么call()不工作在你的情况下,但以下将工作-

program1.py

import subprocess
import sys
inputfile = open('input.txt', 'r')
inputfile.readline()
inputfile.readline()
p = subprocess.call(['python', 'program2.py'],stdin=subprocess.PIPE,stdout=sys.stdout)
p.communicate(inputfile.read())
inputfile.close()

.decode()需要,因为communicate()需要字节字符串,而不是普通字符串。我还将该过程的stdout重定向到脚本的stdout,以便打印结果。另外,写program2.py的更好的方法是-

import sys
for l in sys.stdin:
    print l

这不会导致program2.py进入无限循环。


例子/演示-

我有两个文件,a.pyb.py -

a.py——

import subprocess
import sys
inputfile = open('input.txt', 'r')
inputfile.readline()
inputfile.readline()
p = subprocess.Popen(['/usr/bin/python', 'b.py'],stdin=subprocess.PIPE,stdout=sys.stdout)
p.communicate(inputfile.read())
inputfile.close()

b.py——

import sys
for l in sys.stdin:
    print l

a.py运行结果-

3
4

最新更新