¿Cómo puedo llamar a un programa externo con un script python y recuperar el código de salida y retorno?¿Cómo llamar a un programa externo en python y recuperar el código de salida y retorno?
Respuesta
Mira el módulo de subprocess: un ejemplo sencillo sigue ...
from subprocess import Popen, PIPE
process = Popen(["ls", "-la", "."], stdout=PIPE)
(output, err) = process.communicate()
exit_code = process.wait()
He editado la respuesta anterior para reflejar la sugerencia de Ambroz en caso de que alguien lo haga no lee los comentarios y usa el código previamente incorrecto. –
si esto no funciona por alguna razón, es posible que desee agregar shell = True a los parámetros (¿en Windows?) – ntg
Parece que [la solución anterior] (https://stackoverflow.com/a/707001/1321680) puede reemplazarse por una simple llamada ['subprocess.run()'] (https://docs.python.org/dev/library/subprocess.html#subprocess.run) (se requiere Python> = 3.5). –
Salida del módulo subproceso aquí: http://docs.python.org/library/subprocess.html#module-subprocess. Debe obtener lo que necesita hacer.
Siguiendo el comentario anterior de Ambroz Bizjak, aquí es una solución que funcionó para mí:
import shlex
from subprocess import Popen, PIPE
cmd = "..."
process = Popen(shlex.split(cmd), stdout=PIPE)
process.communicate()
exit_code = process.wait()
Esta es de lejos la mejor respuesta. – dotancohen
Tengo una publicación similar [aquí] (https://stackoverflow.com/questions/1996518/retrieving-the-output-of-subprocess-call/21000308#21000308) que muestra cómo obtener tres cosas de un proceso: exitcode , stdout, stderr. – Jabba
Después de algunas investigaciones, tengo el siguiente código que funciona muy bien para mí. Básicamente imprime stdout y stderr en tiempo real. Espero que ayude a alguien más que lo necesite.
stdout_result = 1
stderr_result = 1
def stdout_thread(pipe):
global stdout_result
while True:
out = pipe.stdout.read(1)
stdout_result = pipe.poll()
if out == '' and stdout_result is not None:
break
if out != '':
sys.stdout.write(out)
sys.stdout.flush()
def stderr_thread(pipe):
global stderr_result
while True:
err = pipe.stderr.read(1)
stderr_result = pipe.poll()
if err == '' and stderr_result is not None:
break
if err != '':
sys.stdout.write(err)
sys.stdout.flush()
def exec_command(command, cwd=None):
if cwd is not None:
print '[' + ' '.join(command) + '] in ' + cwd
else:
print '[' + ' '.join(command) + ']'
p = subprocess.Popen(
command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=cwd
)
out_thread = threading.Thread(name='stdout_thread', target=stdout_thread, args=(p,))
err_thread = threading.Thread(name='stderr_thread', target=stderr_thread, args=(p,))
err_thread.start()
out_thread.start()
out_thread.join()
err_thread.join()
return stdout_result + stderr_result
he desarrollado una pequeña biblioteca (py-execute) que permite ejecutar programas externos, recuperar la salida y el retcode y, al mismo tiempo, obtener una salida en la consola en tiempo real:
>>> from py_execute.process_executor import execute
>>> ret = execute('echo "Hello"')
Hello
>>> ret
(0, 'Hello\n')
puede evitar que se imprima a la consola pasar un simulacro user_io:
>>> from mock import Mock
>>> execute('echo "Hello"', ui=Mock())
(0, 'Hello\n')
lo escribí porque la llanura Popen (En Python 2.7) que estaba teniendo problemas para ejecutar comunicaciones ys con una salida larga
- 1. Llamar al programa externo desde python y obtener su salida
- 2. Llamar a un programa externo desde OCaml
- 3. Obtener el estado de retorno Y la salida del programa
- 4. ¿Cómo llamar a un programa externo con parámetros?
- 5. Llamar a Python desde PHP y obtener el código de retorno
- 6. Llamar a Python desde el archivo Bat y obtener el código de retorno
- 7. Python timeit y salida de programa
- 8. obtener el código de salida para el programa python
- 9. ¿Cómo puedo ejecutar un programa externo desde C y analizar su salida?
- 10. ¿Cómo iniciar y ejecutar un script externo en segundo plano?
- 11. Salida elegante de un programa en Python?
- 12. Ejecute un programa de Emacs y no espere la salida
- 13. php Cómo inicio un programa externo en ejecución - Tengo problemas con el sistema y el ejecutivo
- 14. valor de retorno de subshell y salida a variables locales
- 15. ¿Cómo ejecuto un script externo mientras capturo tanto el código de salida como el de salida en Perl?
- 16. ¿Código de retorno o parámetro de salida?
- 17. Cómo recuperar un Subversion externo sin recuperar todos los demás directorios y subdirectorios
- 18. ¿Cómo ejecutar un programa externo desde Node.js?
- 19. Recopilación de la salida de un comando externo usando OCaml
- 20. Llamar a un subproceso python como daemon y salir
- 21. Llamando a un método python de C/C++, y extrayendo su valor de retorno
- 22. Archivo .cmd y .bat convirtiendo el código de retorno en un mensaje de error
- 23. Cómo iniciar un ejecutable externo de C# y obtener el código de salida cuando el proceso termina
- 24. partido y el retorno cadena de Python en el medio
- 25. Llamar a funciones de Drupal en un archivo PHP externo
- 26. Captura stdout y stderr de un programa externo * mientras * está ejecutando (Rubí)
- 27. ¿Cómo ejecutar el código antes de la salida del programa?
- 28. Llamar a python desde un programa C++ para su distribución
- 29. Código de salida incorrecto en python al llamar a la secuencia de comandos de Windows
- 30. Declaraciones de retorno y recursión de Python
Existen algunas preguntas y respuestas sobre SO que te ayudarán: http://stackoverflow.com/questions/89228/how-to-call-external-command-in-python –
Posible duplicado de [Llamar a un comando externo en Python] (http://stackoverflow.com/questions/89228/calling-an-external-command-in-python) –