如何重定向子进程的标准输出?

6 投票
3 回答
12201 浏览
提问于 2025-04-15 18:38
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

3 个回答

1

在Python中,关于subprocess.PIPE有一些细微的问题和错误:

看起来这些问题在Python 3及以上版本中已经修复了,但在Python 2.7及更早的版本中仍然存在。如果你还在用旧版本,就需要使用这个链接提供的工具:code.google.com/p/python-subprocess32/

4

你不能这样做。一旦程序启动,它的输出(stdout)就不能从外部改变了。你需要进入这个程序的内部空间,才能修改它的文件描述符。

如果你有办法(在MyReset()里,我想)和正在运行的程序沟通,也许你可以想办法传递一个新的文件名,让它重新打开作为它的输出,这样就可以了。

6

就像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()返回。

撰写回答