【问题标题】:redirecting popen output to file in python将popen输出重定向到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 关闭后,脚本是否还会继续写入它。如果是,它是如何工作的?
【问题讨论】:
标签:
python
pipe
ipc
popen
【解决方案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])