Pregunta error de comprobación de subproceso


Estoy intentando verificar el uso de check_output usando la secuencia de comandos siguiente y encontrando el error de compilación, ¿dónde me estoy equivocando?

import os
import subprocess
from subprocess import check_output

#result = subprocess.check_output(['your_program.exe', 'arg1', 'arg2'])
SCRIPT_ROOT=subprocess.check_output(["pwd","shell=True"])
print SCRIPT_ROOT

def main ():
    pass

if __name__ == '__main__':
    main()

Traceback (most recent call last):
  File "test.py", line 3, in <module>
    from subprocess import check_output
ImportError: cannot import name check_output

5
2017-12-28 00:17


origen


Respuestas:


check_output ha sido introducido en Python 2.7. Si está utilizando una versión anterior de Python, simplemente no está allí.

Alternativa es usar Popen.

output = subprocess.Popen(['pwd'], stdout=subprocess.PIPE).communicate()[0]

Prueba de esto se puede encontrar aquí.

Nueva función: check_output () del módulo de subproceso ejecuta un comando   con un conjunto específico de argumentos y devuelve el resultado del comando como   una cadena cuando el comando se ejecuta sin error, o plantea un   Excepción CalledProcessError de lo contrario.

Demo del sustituto.

import subprocess
cmd = subprocess.Popen(['pwd'], stdout=subprocess.PIPE)
output = cmd.communicate()[0]
print cmd.returncode
print output

Salida

> python p.py
/Users/vlazarenko/tests

La única diferencia real es que Popen no arrojará una excepción cuando el comando devuelva un código distinto de cero.


10
2017-12-28 00:19



No hay check_output en 2.6. Pero si miras el 2.7 fuentees trivial

De hecho, una forma común de lidiar con esto es:

import subprocess
try:
    check_output = subprocess.check_output
except AttributeError:
    def check_output(*popenargs, **kwargs):
        # lines 537-545 copied and pasted from 2.7 source

Esto, por supuesto, requiere que su código sea compatible con PSFL (lo cual es casi seguro, pero si es importante, no tomaría consejo legal de un tipo al azar en SO).

Otra opción es usar subprocess32, un backport del 3.2.3 subprocess módulo a Python 2.4+, que le ofrece no solo las nuevas características y correcciones 2.7, sino también muchas más nuevas. (Personalmente, cada vez que escribo código 2/3, termino escribiendo with subprocess.Popen… y tiene que cambiarlo a with contextlib.closing(subprocess.Popen… o with subprocess32.Popen...)


4
2017-12-28 00:30