如何重定向stdout进行子进程?

时间:2010-01-29 10:57:38

标签: python subprocess stdout

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()在第一次迭代后将进程(可执行文件)初始化为其默认值。

以下行会将进程stdout更改为新文件吗?

proc.stdout = proc_log

3 个答案:

答案 0 :(得分:6)

就像unwind说的那样,你不能改变子进程正在将其输出写入的文件描述符。

你能做什么,是在python脚本中读取子进程的输出,然后将其写回到你想要的任何文件。 E.g:

proc = subprocess.Popen(path, 0, None, subprocess.PIPE, subprocess.PIPE, None)

for l in proc.stdout.readlines():
  output_file.write(l)

很明显,您需要弄清楚控件应该如何在您的应用中运行,即您是否可以从主线程进行写入,主线程何时应该从StartProc()返回,或者您是必须从另一个线程写入,以便主线程可以立即从StartProc()返回。

答案 1 :(得分:4)

你做不到。一旦这个过程开始,它的标准输出就是你无法从外部改变的。你需要进入该进程的空间以使用其文件描述符进行清理。

如果你有办法(在MyReset()中我猜)与正在运行的进程交谈,也许你可以设计一种方法来传递一个新的文件名,以(重新)打开它作为stdout,就这样。

答案 2 :(得分:1)

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

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