bounty还有3天到期。此问题的答案有资格获得+50声望奖励。pseudodev希望引起更多关注这个问题。
我有两个简单的文件。
file1.py
import subprocess
print("Going to run file1")
print(subprocess.check_output(["python", "file2.py"]).decode("utf-8"))
file1.py
print("\n\nHELLO WORLD\n\n")
raise Exception("FOO")
在运行www.example.com时file1.py,您将不会看到“Hello World”。如果你删除了这个异常,你会看到输出。
为什么出现异常时打印被隐藏?
1条答案
按热度按时间pcww981p1#
考虑这些事实:
check_output()
需要捕获输出,因此它不会直接发送到TTY。相应地,内容仅在 * 稍后 *,即运行print()
时打印。check_output()
,当程序运行失败时,立即抛出异常而不是返回。函数必须返回一个值,或者抛出一个异常,它不能同时做这两件事。a(b())
时,b
发生在a
之前。在这种情况下,a
是print()
,b
是subprocess.check_output()
。鉴于上述情况:当
subprocess.check_output()
抛出一个异常时,该异常在print()
启动之前被处理;因此subprocess.check_output()
从子进程stdout捕获的内容永远没有机会返回,更不用说打印了。请注意,您仍然可以检索输出:它被附加到异常对象上。
但是,如果您要对输出做的唯一事情是无条件地打印它,那么首先考虑根本不捕获它,并让
file2.py
直接写入终端(或其他继承的/原始的stdout目的地)。要做到这一点,只需切换到subprocess.run(cmd, check=True)
并完全跳过print
。