我正在编写一个执行进程列表的脚本,并将所有输出连接到另一个进程的输入中。我已经将我的脚本压缩成一个测试用例,使用echo和cat作为实际过程的替身。
#!/usr/bin/python
import os,subprocess
(pipeOut, pipeIn) = os.pipe()
catProcess = subprocess.Popen("/bin/cat", stdin = pipeOut)
for line in ["First line", "Last line"]:
subprocess.call(["/bin/echo",line], stdout = pipeIn)
os.close(pipeIn)
os.close(pipeOut)
catProcess.wait()
该程序按预期工作,但对catProcess.wait()
的调用挂起(可能是因为它仍在等待更多输入)。将close_fds=True
传递给Popen
或call
似乎也无济于事。
有没有办法关闭catProcesses
的标准输入,以便它优雅地退出?或者有其他方式来编写这个程序吗?
答案 0 :(得分:1)
将close_fds=True
传递给catProcess
有助于我的系统。
您无需明确创建管道:
#!/usr/bin/python
from subprocess import Popen, PIPE, call
cat = Popen("cat", stdin=PIPE)
for line in ["First line", "Last line"]:
call(["echo", line], stdout=cat.stdin)
cat.communicate() # close stdin, wait