subprocess.check_output返回代码

Jui*_*icy 42 python subprocess

我在用:

grepOut = subprocess.check_output("grep " + search + " tmp", shell=True)
Run Code Online (Sandbox Code Playgroud)

要运行终端命令,我知道我可以使用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.
Run Code Online (Sandbox Code Playgroud)

但是没有给出任何例子,谷歌没有任何帮助.

Dan*_*Gar 58

您可以从引发的异常中获取错误代码和结果.

这可以通过域来完成returncodeoutput.

例如:

import subprocess

try:
   grepOut = subprocess.check_output("grep " + "test" + " tmp", shell=True)                       
except subprocess.CalledProcessError as grepexc:                                                                                                   
    print "error code", grepexc.returncode, grepexc.output
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你正是我想要的。但现在我想知道,有没有一种方法可以在不使用 try/ except 的情况下获取返回码?IE 只是获取 check_output 的返回码,是 0 还是 1 或者其他对我来说并不重要,我实际上不需要保存输出。 (4认同)
  • 没问题.不幸的是,只要错误代码非零,check_output将始终抛出CalledProcessError.这意味着如果您不希望程序突然终止,则需要try/except子句.但是,如果您不关心错误代码,则可以在到达except子句时使用"pass"语句. (3认同)

jfs*_*jfs 32

有没有办法在没有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,))
Run Code Online (Sandbox Code Playgroud)

您不需要调用外部命令来过滤行,您可以在纯Python中执行:

with open('tmp') as file:
    for line in file:
        if 'test' in line:
            print line,
Run Code Online (Sandbox Code Playgroud)

如果你不需要输出; 你可以使用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)
Run Code Online (Sandbox Code Playgroud)


mko*_*bit 11

Python 3.5引入了该subprocess.run()方法.签名如下:

subprocess.run(
  args, 
  *, 
  stdin=None, 
  input=None, 
  stdout=None, 
  stderr=None, 
  shell=False, 
  timeout=None, 
  check=False
)
Run Code Online (Sandbox Code Playgroud)

返回的结果是a 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
Run Code Online (Sandbox Code Playgroud)