python subprocess.call执行带有进程替代和文件重定向的bash命令

2 投票
1 回答
1724 浏览
提问于 2025-04-16 18:00

在Python中,我想调用一个脚本,这个脚本在执行时会把输出打印到屏幕上,同时还要把标准输出(stdout)和错误输出(stderr)记录到日志文件里。我有一行bash代码想要执行:

script.sh > >(tee /tmp/success.log) 2> >(tee /tmp/errors.log >&2)

这里的script.sh是任何一个会同时输出到标准输出和错误输出的脚本。这行代码会把标准输出和错误输出分别记录到success.log和errors.log这两个日志文件中,同时也会把这些输出显示在屏幕上,具体的解释可以参考这里:如何在使用“tee”和管道时将错误输出写入文件?

现在我想在Python中使用subprocess.call(that_command_as_str, shell=True)来执行这个命令,但Python使用的是/bin/sh来执行命令,而不是/bin/bash,而普通的sh不支持那种类型的重定向。看起来subprocess模块里硬编码了使用/bin/sh。有没有什么办法解决这个问题?

1 个回答

3

把你的命令放在 /bin/bash -c "你的命令内容" 里。

这样的话,/bin/sh 就会运行 bash,然后帮你处理后面的内容。你也可以考虑在 Python 的 Subprocess 模块中使用其他功能来进行重定向,不过上面的方法应该简单又有效。

撰写回答