我们有:
- 基于 Python 的服务器 (A)
- 一个正在运行的命令行应用程序(在同一台 Linux 机器上),它能够读取
stdin
、计算某些内容并将输出提供给stdout
(B)
如何将输入从(A)发送到stdin
(B),并等待(B)的答案,即阅读它的最佳(最优雅)方式是stdout
什么?
如果您使用subprocess
标准库中的 Python 模块生成 (B),则可以将 (B) 设置为 (A) 可读stdin
和stdout
可写的字节缓冲区。
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
沟通。
正如@Deestan 指出的那样,子流程模块是一个优雅且经过验证的流程。当我们必须从 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的输入很少,则 subprocess 是yes。