Mat*_*erg 11 python subprocess popen python-2.6
我正在尝试使用python subprocess.Popen()调用与子进程通信.在我的实际代码中,我正在实现一种类型的IPC,因此我想编写一些数据,读取响应,写入更多数据,读取响应等等.因此,我不能使用Popen.communicate(),否则它将适用于简单的情况.
这段代码显示了我的问题.它从来没有得到第一个响应,挂在第一个"阅读结果".为什么?我怎样才能像我期望的那样完成这项工作?
import subprocess
p = subprocess.Popen(["sed", 's/a/x/g'],
stdout = subprocess.PIPE,
stdin = subprocess.PIPE)
p.stdin.write("abc\n")
print "Reading result:"
print p.stdout.readline()
p.stdin.write("cat\n")
print "Reading result:"
print p.stdout.readline()
Run Code Online (Sandbox Code Playgroud)
sed的输出被缓冲,仅输出其数据,直到累积了足够多或输入流耗尽和关闭为止。
尝试这个:
import subprocess
p = subprocess.Popen(["sed", 's/a/x/g'],
stdout = subprocess.PIPE,
stdin = subprocess.PIPE)
p.stdin.write("abc\n")
p.stdin.write("cat\n")
p.stdin.close()
print "Reading result 1:"
print p.stdout.readline()
print "Reading result 2:"
print p.stdout.readline()
Run Code Online (Sandbox Code Playgroud)
请注意,stdin一旦缓冲区已满,这将无法可靠地完成哪些大数据会阻塞的工作。最好的方法是使用communicate()。
Popen().communicate()如果可以,我会尝试使用它,因为它为您做了很多好事,但是如果您需要Popen()完全按照您的描述使用,则需要设置 sed 以使用-l选项在换行符后刷新其缓冲区:
p = subprocess.Popen(['sed', '-l', 's/a/x/g'],
stdout=subprocess.PIPE,
stdin=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)
你的代码应该可以正常工作
| 归档时间: |
|
| 查看次数: |
13725 次 |
| 最近记录: |