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

时间:2015-08-04 19:14:43

标签: 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就好了。

如何使用从特定行开始的文件作为子进程的stdin?

1 个答案:

答案 0 :(得分:0)

您可以使用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