我们有:
stdin
,计算某些内容并将输出提供给stdout
(B)如何将(A)的输入发送到(B)的stdin
,并等待(B)的答案,即读取其stdout
的最佳(最优雅)方法是什么? ?
答案 0 :(得分:2)
如果使用标准库中的Python subprocess
模块生成(B),则可以将(B)的stdin
和stdout
设置为可读写的字节缓冲区( A)。
b = Popen(["b.exe"], stdin=PIPE, stdout=PIPE)
b.stdin.write("OHAI\n")
print(b.stdout.readline())
对于您给出的示例,最简单的方法是使用communicate
,因为这样可以避免死锁:
b = Popen(["b.exe"], stdin=PIPE, stdout=PIPE)
b_out = b.communicate("OHAI\n")[0]
print(b_out)
http://docs.python.org/release/3.1.3/library/subprocess.html
http://docs.python.org/release/3.1.3/library/subprocess.html#subprocess.Popen.communicate
如果存在大量双向通信,则应注意避免因完全缓冲而导致的死锁。如果您的通信模式存在此类问题,则应考虑使用socket
通信。
答案 1 :(得分:2)
正如@Deestan指出的subprocess,module,是一个优雅且经过验证的。当我们必须从python运行命令时,我们经常使用子进程。
我们主要涉及运行一个命令,主要是内部构建,并捕获其输出。因此,我们运行此类命令的包装器就是这样。
import subprocess
def _run_command( _args, input=[],withShell=False):
"""
Pass args as array, like ['echo', 'hello']
Waits for completion and returns
tuple (returncode, stdout, stderr)
"""
p = subprocess.Popen(_args, shell = withShell,
stdin=subprocess.PIPE, stdout=subprocess.PIPE)
[p.stdin.write(v) for v in input]
stdout, stderr = p.communicate()
return p.returncode, stdout, stderr
_,op,er = _run_command(['cat'],["this","is","for","testing"])
value="".join(op)
print value
_,op,er = _run_command(['ls',"/tmp"])
value="".join(op)
print value
如果您对 B 的输入最小,则子流程为是。