que - subprocess.popen python example
subprocess.check_output código de retorno (3)
¿hay una manera de obtener un código de retorno sin un intento / excepto?
check_output
genera una excepción si recibe un estado de salida distinto de cero porque con frecuencia significa que un comando falló. grep
puede devolver un estado de salida distinto de cero incluso si no hay ningún error; en este caso, podría usar .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,))
No necesita llamar a un comando externo para filtrar líneas, puede hacerlo en Python puro:
with open(''tmp'') as file:
for line in file:
if ''test'' in line:
print line,
Si no necesitas la salida; puedes usar 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)
Estoy usando:
grepOut = subprocess.check_output("grep " + search + " tmp", shell=True)
Para ejecutar un comando de terminal, sé que puedo usar try / except para detectar el error, pero ¿cómo puedo obtener el valor del código de error?
Encontré esto en la documentación oficial:
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.
Pero no hay ejemplos dados y Google no fue de ayuda.
Puede obtener el código de error y los resultados de la excepción que se genera.
Esto se puede hacer a través de los campos returncode
y output
.
Por ejemplo:
import subprocess
try:
grepOut = subprocess.check_output("grep " + "test" + " tmp", shell=True)
except subprocess.CalledProcessError as grepexc:
print "error code", grepexc.returncode, grepexc.output
Python 3.5 introdujo el método subprocess.run()
. La firma se ve como:
subprocess.run(
args,
*,
stdin=None,
input=None,
stdout=None,
stderr=None,
shell=False,
timeout=None,
check=False
)
El resultado devuelto es un subprocess.CompletedProcess
. En 3.5, puede acceder a los returncode
, returncode
, stdout
y stderr
desde el proceso ejecutado.
Ejemplo:
>>> result = subprocess.run([''ls'', ''/tmp''], stdout=subprocess.DEVNULL)
>>> result.returncode
0
>>> result = subprocess.run([''ls'', ''/nonexistent''], stderr=subprocess.DEVNULL)
>>> result.returncode
2