我正在使用:
grepOut = subprocess.check_output("grep " + search + " tmp", shell=True)
要运行终端命令,我知道我可以使用try / except来捕获错误但是如何获取错误代码的值?
我在官方文档中找到了这个:
exception subprocess.CalledProcessError
Exception raised when a process run by check_call() or check_output() returns a non-zero exit status.
returncode
Exit status of the child process.
但是没有给出任何例子,谷歌没有帮助。
答案 0 :(得分:53)
您可以从引发的异常中获取错误代码和结果。
可以通过字段returncode
和output
完成此操作。
例如:
import subprocess
try:
grepOut = subprocess.check_output("grep " + "test" + " tmp", shell=True)
except subprocess.CalledProcessError as grepexc:
print "error code", grepexc.returncode, grepexc.output
答案 1 :(得分:30)
如果有没有办法在没有try / except的情况下获得返回代码?
check_output
收到非零退出状态,则会引发异常,因为它经常表示命令失败。即使没有错误,grep
也可能返回非零退出状态 - 在这种情况下您可以使用.communicate()
:
from subprocess import Popen, PIPE
pattern, filename = 'test', 'tmp'
p = Popen(['grep', pattern, filename], stdin=PIPE, stdout=PIPE, stderr=PIPE,
bufsize=-1)
output, error = p.communicate()
if p.returncode == 0:
print('%r is found in %s: %r' % (pattern, filename, output))
elif p.returncode == 1:
print('%r is NOT found in %s: %r' % (pattern, filename, output))
else:
assert p.returncode > 1
print('error occurred: %r' % (error,))
您无需调用外部命令来过滤行,您可以在纯Python中执行此操作:
with open('tmp') as file:
for line in file:
if 'test' in line:
print line,
如果您不需要输出;你可以使用subprocess.call()
:
import os
from subprocess import call
try:
from subprocess import DEVNULL # Python 3
except ImportError: # Python 2
DEVNULL = open(os.devnull, 'r+b', 0)
returncode = call(['grep', 'test', 'tmp'],
stdin=DEVNULL, stdout=DEVNULL, stderr=DEVNULL)
答案 2 :(得分:8)
Python 3.5引入了subprocess.run()
方法。签名如下:
subprocess.run(
args,
*,
stdin=None,
input=None,
stdout=None,
stderr=None,
shell=False,
timeout=None,
check=False
)
返回的结果是subprocess.CompletedProcess
。在3.5中,您可以从已执行的流程中访问args
,returncode
,stdout
和stderr
。
示例:
>>> result = subprocess.run(['ls', '/tmp'], stdout=subprocess.DEVNULL)
>>> result.returncode
0
>>> result = subprocess.run(['ls', '/nonexistent'], stderr=subprocess.DEVNULL)
>>> result.returncode
2
答案 3 :(得分:0)
要获取输出代码和返回代码(不使用try / except),只需使用subprocess.getstatusoutput(需要Python 3)
答案 4 :(得分:0)
在Python 2中-使用commands模块:
import command
rc, out = commands.getstatusoutput("ls missing-file")
if rc != 0: print "Error occurred: %s" % out
在Python 3中-使用subprocess模块:
import subprocess
rc, out = subprocess.getstatusoutput("ls missing-file")
if rc != 0: print ("Error occurred:", out)
发生错误:ls:无法访问丢失的文件:没有这样的文件或目录