[英]Exception Handling with subprocess.run in Python
我正在尝试创建一个 function,它可以运行任何 shell 命令并返回该命令的标准输出,而不必担心可能引发的任何异常。 当使用xyz testing
等不正确的命令测试下面编写的代码时,我得到的是FileNotFoundError
而不是CalledProcessError
,即使当我在 shell 中运行命令xyz testing
返回非零返回码时也是如此。但是,当我运行相同的 function 时使用像ls -xyz
这样的类似无效命令,我得到了预期的CalledProcessError
。 有谁知道为什么没有以一致的方式抛出异常。
try:
cmd_result = subprocess.run(
cmd,
capture_output=True,
text=True,
check=True,
)
except subprocess.CalledProcessError as exc:
click.echo(exc.stderr)
click.echo(cmd)
sys.exit(1)
谢谢
我尝试放置shell=True
选项,然后错误情况交换( xyz testing
)通过并且ls -xyz
失败。 我一直坚持我还能尝试什么。
有几件事正在发生。 使用check=True
,如果执行命令并返回非零退出状态,子进程将引发CalledProcessError
。 当shell=False
时,找不到要执行的文件,因此您得到了FileNotFound
错误代码。 程序没有运行,没有要检查的退出代码,所以CalledProcessError
不是一个选项。
当shell=True
时,子进程运行中间 shell。现在它的 shell 返回码很重要,它可能与被调用进程不同。 Subprocess 找到中间 shell,所以没有FileNotFound
错误,但是找不到程序所以返回一个非零值,产生另一个异常。 考虑命令"xyz testing;exit 0"
,即使 xyz 不存在,它也不会生成调用进程错误。 那是因为 shell 返回了 0 退出代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.