我使用 subprocess.check_call 调用另一个脚本,但我不想在控制台上看到其他脚本的打印结果。 我尝试过:stdout=subprocess.DEVNULL 和 stderr=subprocess.DEVNULL,但我仍然看到打印了一些输出。
我的脚本之一使用 stderr,另一个使用 stdout。 为什么不起作用?
subprocess.check_call(cmd, timeout=timeout_sec, shell=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
如果我需要 stdout 或 stderr,我可以找到什么?
我没有使用
check_call
,而是使用 run
,它提供了更多选项。
import subprocess
def main():
cmd = ["./doit.sh"] # Can be anything
timeout_sec = 10
completed_process = subprocess.run(
cmd,
timeout=timeout_sec,
shell=True,
check=True, # Behave like check_call
text=True, # Capture stdout, stderr as text, not bytes
capture_output=True, # Capture to internal .stdout, .stderr
)
# Do something with stdout and stderr
print("STDOUT:")
print(completed_process.stdout)
print("STDERR:")
print(completed_process.stderr)
if __name__ == "__main__":
main()
run
函数返回一个CompletedProcess对象,其中包括stdout、stderr等属性text=True
参数会改变它,所以它们是 str capture_output=True
参数将抑制 stdout 和 stderr 的打印,并将它们捕获到 CompletedProcess
对象的属性中。