我希望能够使用Popen.communicate并将stdout记录到文件中(除了从communicate()返回的以外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)

与此相关的任何问题,看一下沟通的暗示,看起来都不错。 但是有更好的方法吗?

===============>>#1 票数:1

根据您对“ nicer”的定义,我会说,以下几点可能会更好,因为它避免了额外的发球过程:

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()可能不是最佳选择,因为它会缓冲内存中的所有内容。

  ask by Tom translate from so

未解决问题?本站智能推荐:

3回复

Python子进程Popen管道

我试图在python中发出命令并读取输入并将其解析回去。 这是我要发出的命令(例如在命令行上运行时的示例) 我正在尝试使用python子进程 ` 是一个| 子进程无法使用命令? 如果是这样,还有另一种方法可以运行此shell命令并获取输入吗? 更新:(使用单个
3回复

Popen子进程Python

我正在使用Popen进行远程调用脚本 stdout = s.communicate() 打印标准输出 该脚本不会以shell脚本中提到的状态退出,而是仅显示成功或失败状态。 我想根据外壳脚本退出状态代码。 这是shell脚本 如何获得状态码返回?
1回复

子进程,Popen Python

我想运行一个程序,比如MATLAB或其他来自Python的FEA软件,等待它运行并存储结果,然后再用Python进行处理。 我无法找到一个关于如何这样做的真正基本的例子。 一个简单的代码或任何有用的链接将受到高度赞赏。 Subprocess模块​​的帮助看起来有点复杂。
1回复

Python中的子进程Popen和PIPE

以下代码将空行打印为输出,为false。 问题不在于权限,因为我使用777权限测试了pdf -file的命令。 如何修复命令以提供正确的输出?
1回复

通过Python子进程Popen进行的SCP:“无法访问身份文件”

从Warning: Identity File ./id_rsa.key not accessible: no such file or directory.执行SCP时,出现以下错误: Warning: Identity File ./id_rsa.key not accessible: no
8回复

具有修改后环境的Python子进程/ Popen

我相信在环境稍有修改的情况下运行外部命令是很常见的情况。 这就是我倾向于这样做的方式: 我感觉到有更好的办法了。 看起来还好吗?
2回复

Python子进程.Popen不起作用

我一直在阅读许多文档,但仍不确定我在做什么错。 因此,我有一个单独的Shell脚本,它会启动一个单独的服务器,然后启动我正在处理的服务器。 连接服务器后,我要运行ls就是这样。 但是,由于某种原因,stdin = subprocess.PIPE阻止了Popen命令的终止,以便可以执行下
2回复

在Python中终止启动的Popen子进程

我在Windows上,正在使用subprocess.Popen启动一个新进程,该进程要在某个点终止。 但是,我启动的gui仍然可见。 一个最小的示例是启动PNG查看器: 在执行kill()命令后,gui仍在运行,我必须手动将其关闭。 作为FAS,我理解这一点可以在Linux上通
1回复

Python子进程Popen没有向shell发送所有参数

我正在使用Python的子进程模块来启动另一个程序。 该程序需要一个参数'-c {0-7}'。 在C ++程序中,我正在检查传入的参数: 这是我运行python脚本时的输出: 很明显,参数'-c3'没有传递给子进程。 有什么想法吗?
1回复

python子进程Popen不提供标准输入

我知道已经多次问过类似的问题,但是我没有设法将这些解决方案应用于我的案例。 我有这个互动程序: 我正在尝试通过python与之通信,但这会发生: 有时它挂在那里,但有时会打印 任何想法?