将popen输出重定向到python

时间:2015-11-19 07:08:32

标签: python pipe ipc popen

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

  1. 为什么>file无效。

    subprocess.Popen([SCRIPT, "R", ">", FILE, "2>", "/dev/null"])
    
  2. 这很好吗

    with open(FILE,'w+') as f:
        subprocess.Popen([SCRIPT, stdout=f]
        f.close()
    
  3. 在我的情况下,我试图在无限循环(不停止)中运行脚本,并且还有一些其他进程监视其输出。

    即使f关闭后,脚本仍然会写入其中。如果是的话,它是如何运作的?

2 个答案:

答案 0 :(得分:3)

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

  

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

     

PIPE表示应创建一个新的子管道。 DEVNULL表示将使用特殊文件os.devnull。使用默认设置None,不会发生重定向;子项的文件句柄将从父项继承。

     

此外,stderr可以是STDOUT,表示应将应用程序中的stderr数据捕获到与stdout.相同的文件句柄中

您应该使用以下代码:

with open(FILE, 'w+') as f:
    subprocess.Popen([SCRIPT, 'R'],  stdout=f, stderr=subprocess.DEVNULL))

由于您正在使用with,因此无需关闭该文件。

答案 1 :(得分:0)

我认为你必须尝试,

with open(FILE,'w+') as f:
    subprocess.Popen([SCRIPT, stdout=f, stderr=f])