我希望能够使用Popen.communicate
并将stdout记录到文件中(除了从communicate()
返回。
这就是我想要的 - 但这真的是一个好主意吗?
cat_task = subprocess.Popen(["cat"], stdout=subprocess.PIPE, stdin=subprocess.PIPE)
tee_task = subprocess.Popen(["tee", "-a", "/tmp/logcmd"], stdin=cat_task.stdout,
stdout = subprocess.PIPE, close_fds=True)
cat_task.stdout = tee_task.stdout #since cat's stdout is consumed by tee, read from tee.
cat_task.communicate("hello there")
('hello there', None)
任何与此有关的问题,看着沟通的暗示看起来不错。但是有更好的方法吗?
答案 0 :(得分:1)
根据您对“更好”的定义,我会说以下可能更好,因为它避免了额外的T恤过程:
import subprocess
def logcommunicate(self, s):
std = self.oldcommunicate(s)
self.logfilehandle.write(std[0])
return std
subprocess.Popen.oldcommunicate = subprocess.Popen.communicate
subprocess.Popen.communicate = logcommunicate
logfh = open("/tmp/communicate.log", "a")
proc = subprocess.Popen(['cat'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
proc.logfilehandle = logfh
result = proc.communicate("hello there\n")
print result
简而言之,它为communicate()
提供了一个包装器,它将stdout写入您选择的文件句柄,然后返回原始元组供您使用。我省略了异常处理;如果程序更重要,你应该补充一点。此外,如果您希望创建多个Popen
对象并希望它们都记录到同一个文件,您应该安排logcommunicate()
是线程安全的(每个文件句柄同步)。您可以轻松扩展此解决方案以写入stdout和stderr的单独文件。
请注意,如果您希望来回传递大量数据,那么communicate()
可能不是最佳选择,因为它会将所有内容缓冲到内存中。