读/写Popen()子流程

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)

glg*_*lgl 5

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()

  • 啊,您是对的,缓冲确实是问题所在。 (2认同)

gnr*_*gnr 5

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)

你的代码应该可以正常工作