将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 不允许使用> 从文档中重定向输出或错误消息:

stdinstdoutstderr分别指定执行程序的标准输入、标准输出和标准错误文件句柄。有效值为PIPEDEVNULL、现有文件描述符(正整数)、现有文件对象和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中的文件的主要内容,如果未能解决你的问题,请参考以下文章

19重定向管道与popen模型

在Python中,如何将多个进程与popen链接在一起,同时将中间部分结果重定向到一个字符串中

使用子进程的python脚本,将所有输出重定向到文件

报错笔记:linux 命令行中的print输出内容无法重定向到文件中

Python 覆盖不会将输出重定向到文件

重定向子进程标准输出