Python 中子进程的输出重定向:文件和终端同时进行
当使用 Python 的 subprocess.call 函数执行多个可执行文件时,用户可能希望stdout 和 stderr 同时写入指定文件和终端。
要实现这一点,可以不使用 subprocess.call,而是直接使用带有 stdout=PIPE 参数的 Popen 函数。这允许从 p.stdout 读取:
import sys from subprocess import Popen, PIPE def tee(infile, *files): for line in iter(infile.readline, b""): for f in files: f.write(line) def teed_call(cmd_args, stdout=None, stderr=None): p = Popen( cmd_args, stdout=PIPE if stdout is not None else None, stderr=PIPE if stderr is not None else None ) if stdout is not None: tee(p.stdout, stdout, getattr(sys.stdout, "buffer", sys.stdout)) if stderr is not None: tee(p.stderr, stderr, getattr(sys.stderr, "buffer", sys.stderr)) for t in threads: t.join() return p.wait()
使用此修改后的函数,用户可以为 stdout 和 stderr 指定文件,同时仍打印到终端。例如:
outf, errf = open("out.txt", "wb"), open("err.txt", "wb") assert not teed_call(["cat", __file__], stdout=None, stderr=errf) assert not teed_call(["echo", "abc"], stdout=outf, stderr=errf, bufsize=0) assert teed_call(["gcc", "a b"], close_fds=True, stdout=outf, stderr=errf)
以上是如何在 Python 中同时将 stdout 和 stderr 从子进程重定向到文件和终端?的详细内容。更多信息请关注PHP中文网其他相关文章!