【问题标题】:How to redirect stdout for a subprocess?如何重定向子进程的标准输出?
【发布时间】:2011-01-10 19:26:34
【问题描述】:
def StartProc(dir, parm):
    global proc    

    proc_log = open(dir + os.sep + "MyLog.txt","w")  #new path for each file

    if parm:
        proc = subprocess.Popen(path, 0, None, subprocess.PIPE, proc_log, None)
    else:
        MyReset(proc)                     #reset the process(proc) to its default values
        proc.stdout = proc_log            #no effect
        print "fptr ", proc.stdout
    #endif
#enddef

prm = True

for i in range(0, 5):
    StartProc(i, prm)
    prm = False
#endfor

我想要做的是只启动一次可执行文件,但在每次迭代中,我想将进程输出重定向到不同的文件。发生了什么,文件是在不同的路径中创建的,但输出被重定向到第一次创建的文件。

注意:MyReset() 在第一次迭代后将进程(可执行文件)初始化为其默认值。

以下行会将进程标准输出更改为新文件吗?

proc.stdout = proc_log

【问题讨论】:

    标签: python subprocess stdout


    【解决方案1】:

    就像 unwind 所说,您不能更改子进程正在将其输出写入的文件描述符。

    您可以做的是从您的 python 脚本中读取子进程的输出,然后将其写回您想要的任何文件。例如:

    proc = subprocess.Popen(path, 0, None, subprocess.PIPE, subprocess.PIPE, None)
    
    for l in proc.stdout.readlines():
      output_file.write(l)
    

    显然,您需要弄清楚控制在您的应用程序中的行为方式,即您是否可以从主线程进行写入,在这种情况下主线程何时应该从StartProc() 返回,或者您是否必须从另一个线程进行写入,以便主线程可以立即从StartProc()返回。

    【讨论】:

      【解决方案2】:

      你不能。一旦进程启动,它的标准输出就无法从外部改变。你需要进入该进程的空间来处理它的文件描述符。

      如果您有办法(我猜是MyReset())与正在运行的进程对话,也许您可​​以设计一种方法来为其传递一个新文件名,以作为标准输出(重新)打开。

      【讨论】:

        【解决方案3】:

        python 中存在与 subprocess.PIPE 相关的细微问题/错误: http://bugs.python.org/issue1652

        显然,这在 python3+ 中已修复,但在 python 2.7 及更早版本中未修复。为此,您需要使用: code.google.com/p/python-subprocess32/

        【讨论】:

          猜你喜欢
          • 2013-06-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-05
          • 2022-12-14
          • 1970-01-01
          • 2013-07-16
          • 1970-01-01
          相关资源
          最近更新 更多