繁体   English   中英

Python 中 subprocess.run 的异常处理

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM