在Python中运行bash命令并处理错误

4

我想在Python程序中运行一组bash脚本命令。我必须逐个运行命令,并处理每个命令的错误和异常。为此,我使用 subprocess 模块和下面的 call 函数:

result = subprocess.call("echo testing", shell = True)

正如预期的那样,这个命令会打印出 "testing" 并将 result 的值设置为 0,这意味着该命令已成功执行。或者,在下面的命令中:

result = subprocess.call("echso testing", shell = True)

它会打印出“/bin/sh: 1: echso: not found”,并将result的值设置为127,这意味着echso命令无效。我的问题是,我在哪里可以找到包含描述的完整错误号码列表,以便用于错误处理?到目前为止,我找到了以下退出错误列表:

1: general errors
2: misuse of shell builtins (pretty rare)
126: cannot invoke requested command
127: command not found error
128: invalid argument to “exit”
128+n: fatal error signal “n” (for example, kill -9 = 137)
130: script terminated by Ctrl-C 

这是全部内容吗,还是你知道更多带有说明的错误代码?

1
你手头的列表已经是最好的了。每个程序都可以自由地使用它想要的退出代码。除了“非零等于错误”之外,你真的不能依赖任何东西。话虽如此,你可以捕获stderr并提供给用户呈现。 - kindall
1
可能是 https://dev59.com/o3NA5IYBdhLWcg3wEpgU 的重复问题。 - runDOSrun
3个回答

1
result = subprocess.Popen("echo testing", shell = True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
output,err=result.communicate()
if output:
    print "success"
else:
    print err

与其找到数字错误,不如直接找到并处理错误。


1
这不是问题的答案。 - Etan Reisner
这会给你来自运行命令的标准错误(我相信)但并不总是一样的东西。 - Etan Reisner
@EtanReisner他基本上想要处理错误。我想这是一个不错的方法。 - vks
@vks 谢谢回答。您的代码导致此错误: Traceback (most recent call last): File "/home/a02/workspace/test/main.py", line 7, in <module> result = subprocess.Popen("echo testing", shell=True, stdout=subprocess.PIPE, stderr=subprocess.Popen)
File "/usr/lib/python2.7/subprocess.py", line 672, in init errread, errwrite) = self._get_handles(stdin, stdout, stderr) File "/usr/lib/python2.7/subprocess.py", line 1065, in _get_handles errwrite = stderr.fileno() AttributeError: type object 'Popen' has no attribute 'fileno' 我错过了什么吗?
- user823743
@user823743 打错字了,应该是 stderr=subprocess.PIPE 而不是 stderr=subprocess.Popen - Etan Reisner
显示剩余2条评论

1
你几乎提到了它们的所有内容。更详细的列表可以在这里找到,以下是每个工具的一些有用信息:

reserved exit codes

根据上表,退出代码1-2、126-165和255具有特殊含义,因此应避免用于用户指定的退出参数。以exit 127结束脚本在故障排除时肯定会引起混淆(错误代码是“未找到命令”还是用户定义的代码?)。然而,许多脚本使用exit 1作为一般性的出错紧急处理。由于退出代码1表示很多可能的错误,因此在调试中并不特别有用。
已经有人试图系统化退出状态码(参见/usr/include/sysexits.h),但这只适用于C和C++程序员。针对脚本编写类似的标准可能是合适的。本文的作者建议将用户定义的退出代码限制在64-113范围内(除了0表示成功),以符合C/C++标准。这将分配50个有效代码,并使脚本故障排除更加简单明了。
超出范围的退出值可能导致意外的退出代码。大于255的退出值返回一个模256的退出代码。例如,exit 3809给出一个退出代码225(3809 % 256 = 225)。

0

bash man页面有一个3.7.5 Exit Status部分,涵盖了您指定的值(尽管我没有看到130)。

除此之外,我不知道是否有任何良好的标准。

sysexits.h,但我不确定有多少人实际使用它(在Linux上也可用)。


那就是为什么我更喜欢另外的解决方案。它至少能处理所有情况。 - vks
@vks 不,它不能处理所有情况。它不能处理那些不向stderr写入而返回失败返回代码的事情。 - Etan Reisner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接