subprocess.check_output return code

前端 未结 5 1819
刺人心
刺人心 2020-12-02 22:03

I am using:

grepOut = subprocess.check_output(\"grep \" + search + \" tmp\", shell=True)

To run a terminal command, I know that I can use a

相关标签:
5条回答
  • 2020-12-02 22:32

    In Python 2 - use commands module:

    import command
    rc, out = commands.getstatusoutput("ls missing-file")
    if rc != 0: print "Error occurred: %s" % out
    

    In Python 3 - use subprocess module:

    import subprocess
    rc, out = subprocess.getstatusoutput("ls missing-file")
    if rc != 0: print ("Error occurred:", out)
    

    Error occurred: ls: cannot access missing-file: No such file or directory

    0 讨论(0)
  • 2020-12-02 22:43

    is there a way to get a return code without a try/except?

    check_output raises an exception if it receives non-zero exit status because it frequently means that a command failed. grep may return non-zero exit status even if there is no error -- you could use .communicate() in this case:

    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,))
    

    You don't need to call an external command to filter lines, you could do it in pure Python:

    with open('tmp') as file:
        for line in file:
            if 'test' in line:
                print line,
    

    If you don't need the output; you could use 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)
    
    0 讨论(0)
  • 2020-12-02 22:47

    You can get the error code and results from the exception that is raised.

    This can be done through the fields returncode and output.

    For example:

    import subprocess
    
    try:
       grepOut = subprocess.check_output("grep " + "test" + " tmp", shell=True)                       
    except subprocess.CalledProcessError as grepexc:                                                                                                   
        print "error code", grepexc.returncode, grepexc.output
    
    0 讨论(0)
  • 2020-12-02 22:52

    Python 3.5 introduced the subprocess.run() method. The signature looks like:

    subprocess.run(
      args, 
      *, 
      stdin=None, 
      input=None, 
      stdout=None, 
      stderr=None, 
      shell=False, 
      timeout=None, 
      check=False
    )
    

    The returned result is a subprocess.CompletedProcess. In 3.5, you can access the args, returncode, stdout, and stderr from the executed process.

    Example:

    >>> result = subprocess.run(['ls', '/tmp'], stdout=subprocess.DEVNULL)
    >>> result.returncode
    0
    
    >>> result = subprocess.run(['ls', '/nonexistent'], stderr=subprocess.DEVNULL)
    >>> result.returncode
    2
    
    0 讨论(0)
  • 2020-12-02 22:52

    To get both output and return code (without try/except) simply use subprocess.getstatusoutput (Python 3 required)

    0 讨论(0)
提交回复
热议问题