将popen输出重定向到python中的文件
Posted
技术标签:
【中文标题】将popen输出重定向到python中的文件【英文标题】:redirecting popen output to file in python 【发布时间】:2015-11-19 07:08:32 【问题描述】:我已经看到很多stdout=file
将重定向到文件的答案。但我有几个疑问。
为什么>file
不起作用。
subprocess.Popen([SCRIPT, "R", ">", FILE, "2>", "/dev/null"])
这样好吗
with open(FILE,'w+') as f:
subprocess.Popen([SCRIPT, stdout=f]
f.close()
在我的情况下,我试图在无限循环中运行一个脚本(它不会停止),并且还有一些其他进程正在监视它的输出。
即使在 f 关闭后,脚本是否还会继续写入它。如果是,它是如何工作的?
【问题讨论】:
【参考方案1】:因为subprocess
不允许使用>
从文档中重定向输出或错误消息:
stdin
、stdout
和stderr
分别指定执行程序的标准输入、标准输出和标准错误文件句柄。有效值为PIPE
、DEVNULL
、现有文件描述符(正整数)、现有文件对象和None
。
PIPE
表示应该创建一个到子节点的新管道。DEVNULL
表示将使用特殊文件os.devnull
。使用默认设置None
,不会发生重定向;子文件句柄将从父文件继承。另外,
stderr
可以是STDOUT
,这表明来自应用程序的标准错误数据应该被捕获到与stdout.
相同的文件句柄中
您应该使用以下代码:
with open(FILE, 'w+') as f:
subprocess.Popen([SCRIPT, 'R'], stdout=f, stderr=subprocess.DEVNULL))
因为你使用的是with
,所以不需要关闭文件。
【讨论】:
【参考方案2】:我认为你必须尝试,
with open(FILE,'w+') as f:
subprocess.Popen([SCRIPT, stdout=f, stderr=f])
【讨论】:
您不需要关闭文件,它应该自动完成以上是关于将popen输出重定向到python中的文件的主要内容,如果未能解决你的问题,请参考以下文章
在Python中,如何将多个进程与popen链接在一起,同时将中间部分结果重定向到一个字符串中