Python 重定向子进程到文件和控制台
Python 重定向子进程到文件和控制台
使用Python,我想创建一个子进程,并将其输出重定向到文件和控制台。
我在这篇帖子中找到了如何同时打印到控制台和文件的解释,但是这些解决方案在创建子进程时无效:
sys.stdout = Logger() print( "Hello") # 打印到控制台和文件 res = subprocess.call(cmd) # 命令输出只打印到控制台
这里的行为相同:
with Tee('outfile.log', 'w'): print( "Hello" ) res = subprocess.call(cmd)
如何将子进程的输出重定向到控制台(供用户查看)和文件(供我在代码中检查)?
注意:我在Windows上,所以使用系统的tee
不合适。
Python中使用subprocess模块将子进程的输出重定向到文件和控制台的问题。
问题的原因是需要将cmd命令的标准输出重定向到tee命令的标准输入。在Windows系统中,需要一种更通用的解决方案。
解决方法如下:
首先,通过subprocess.Popen创建tee进程,并将其标准输入重定向到outfile.log文件:
tee = subprocess.Popen(['/usr/bin/tee', 'outfile.log'], stdin=subprocess.PIPE)
然后,使用subprocess.call运行cmd命令,并将其标准输出重定向到tee的标准输入:
subprocess.call(cmd, stdout=tee.stdin)
最后,关闭tee的标准输入:
tee.stdin.close()
对于没有tee命令的系统,可以使用以下解决方法读取命令的输出,并将其写入stdout和日志文件:
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True) with open('outfile.log', 'w') as f: while True: data = proc.stdout.read(1024) if not data: break sys.stdout.write(data) f.write(data)
在Windows系统中,出现了一个错误:TypeError: must be str, not bytes。可以使用data.decode("utf-8")或data.decode("ascii")来解决。
此外,需要处理stderr输出。可以通过指定stderr=subprocess.STDOUT来获取标准错误输出和标准输出。
同时,还需要注意在第一个示例中关闭proc.stdout,以防止cmd命令在tee进程关闭后挂起。可以在call之前关闭或者使用tee = Popen(['tee', 'logfile'], stdin=PIPE); call(cmd, stdout=tee.stdin)。
最后,可以使用tee.communicate()方法在call之后关闭管道。