español - subproceso python check_output devuelto estado de salida distinto de cero 1
subprocess python 3 example (2)
estos son mis códigos python:
import subprocess
subprocess.check_output("ls",shell=True,stderr=subprocess.STDOUT)
import subprocess
subprocess.check_output("yum",shell=True,stderr=subprocess.STDOUT)
el primero funciona bien, pero el segundo regreso:
Traceback (most recent call last):
File "/usr/lib/x86_64-linux-gnu/gedit/plugins/pythonconsole/console.py", line 378, in __run
r = eval(command, self.namespace, self.namespace)
File "<string>", line 1, in <module>
File "/usr/lib/python3.4/subprocess.py", line 616, in check_output
raise CalledProcessError(retcode, process.args, output=output)
subprocess.CalledProcessError: Command ''yum'' returned non-zero exit status 1
¿por qué sucede esto? ¿Es eso porque ls es el comando original de shell pero yum es el nuevo paquete? ¿Cómo resolver este problema?
El comando yum
que ejecuta se ejecutó correctamente. Devuelve un estado que no es cero, lo que significa que se produjo un error durante el procesamiento del comando. Es probable que desee agregar algún argumento a su comando yum
para arreglar eso.
Su código podría mostrar este error de esta manera:
import subprocess
try:
subprocess.check_output("dir /f",shell=True,stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
raise RuntimeError("command ''{}'' return with error (code {}): {}".format(e.cmd, e.returncode, e.output))
La palabra check_
en el nombre significa que si el comando (el shell en este caso que devuelve el estado de salida del último comando ( yum
en este caso)) devuelve un estado distinto de cero, entonces aumenta la excepción CalledProcessError
. Es por diseño. Si el comando que desea ejecutar puede devolver un estado distinto de cero en caso de éxito, entonces capture esta excepción o no use check_
methods. Puede usar subprocess.call
en su caso porque está ignorando la salida capturada, por ejemplo:
import subprocess
rc = subprocess.call([''grep'', ''pattern'', ''file''],
stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT)
if rc == 0: # found
...
elif rc == 1: # not found
...
elif rc > 1: # error
...
No necesita shell=True
para ejecutar los comandos de su pregunta.