如何重定向子进程的标准输出?
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()
返回。