Python 重定向子进程到文件和控制台

14 浏览
0 Comments

Python 重定向子进程到文件和控制台

使用Python,我想创建一个子进程,并将其输出重定向到文件控制台。

我在这篇帖子中找到了如何同时打印到控制台和文件的解释,但是这些解决方案在创建子进程时无效:

sys.stdout = Logger()
print( "Hello") # 打印到控制台和文件
res = subprocess.call(cmd) # 命令输出只打印到控制台

这里的行为相同:

with Tee('outfile.log', 'w'):
    print( "Hello" )
    res = subprocess.call(cmd)

如何将子进程的输出重定向到控制台(供用户查看)和文件(供我在代码中检查)?

注意:我在Windows上,所以使用系统的tee不合适。

0
0 Comments

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之后关闭管道。

0