subprocess无法从其他进程获取stdin输入

时间:2012-07-19 14:43:21

标签: python multiprocessing subprocess

我在两个进程之间使用subprocess交换数据

我使用以下内容编辑repeat.py文件

此文件是http://www.doughellmann.com/PyMOTW/subprocess/

的示例
import sys

sys.stderr.write('repeater.py: starting\n')
sys.stderr.flush()

while True:
    next_line = sys.stdin.readline()
    if not next_line:
        break
    sys.stdout.write(next_line)
    sys.stdout.flush()

sys.stderr.write('repeater.py: exiting\n')
sys.stderr.flush()

并在ipython

中运行此文件
In [1]: import subprocess

In [2]:      f=subprocess.Popen(['python','~/repeat.py'],shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE)

In [3]: f.stdin.write('teststs\n')

In [4]: f.communicate()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'teststs' is not defined
Out[4]: ('', None)

为什么没有定义teststs

2 个答案:

答案 0 :(得分:3)

您似乎正在启动交互式Python会话而不是运行repeat.py。尝试删除shell=True,它与参数列表一起没有意义。 (顺便说一句,使用shell=True几乎总是一个坏主意。)

答案 1 :(得分:-1)

这在前5次按键时会产生一些奇怪的行为。我不知道为什么。之后,如果工作正常,并且我们可以访问ls -lcd,按下UP时的先前命令,似乎命令行具有完整功能。

#!/bin/python3

import subprocess
import sys

proc = subprocess.Popen(['bash'])
while True:
    buff = sys.stdin.readline()
    stdoutdata, stderrdata = proc.communicate(buff)
    if( stdoutdata ):
        print( stdoutdata )
    else:
        print('n')
        break

Here是我的类似问题。