将 popen 输出重定向到 python 中的文件

SS3*_*306 3 python ipc pipe popen

我已经看到很多stdout=file将重定向到文件的答案。但我有几个疑问。

  1. 为什么不起作用>file

    subprocess.Popen([SCRIPT, "R", ">", FILE, "2>", "/dev/null"])
    
    Run Code Online (Sandbox Code Playgroud)
  2. 这样可以吗

    with open(FILE,'w+') as f:
        subprocess.Popen([SCRIPT, stdout=f]
        f.close()
    
    Run Code Online (Sandbox Code Playgroud)

就我而言,我尝试在无限循环中运行脚本(不会停止),并且有一些其他进程监视其输出。

即使 f 关闭后,脚本是否仍继续写入其中。如果是,它是如何工作的?

Kev*_*uan 7

因为subprocess不允许使用>从文档重定向输出或错误消息:

\n\n
\n

stdinstdoutstderr分别指定执行的程序\xe2\x80\x99的标准输入、标准输出和标准错误文件句柄。有效值为PIPEDEVNULL、现有文件描述符(正整数)、现有文件对象和None

\n\n

PIPE指示应创建一个通往子级的新管道。 DEVNULL表示os.devnull将使用特殊文件。默认情况下None,不会发生重定向;child\xe2\x80\x99s 文件句柄将从父级继承。

\n\n

此外,stderrcan be STDOUT,这表明来自应用程序的 stderr 数据应该被捕获到与stdout.

\n
\n\n
\n\n

并且您应该使用以下代码:

\n\n
with open(FILE, \'w+\') as f:\n    subprocess.Popen([SCRIPT, \'R\'],  stdout=f, stderr=subprocess.DEVNULL))\n
Run Code Online (Sandbox Code Playgroud)\n\n

因为您正在使用with,所以不需要关闭该文件。

\n