tipos script programa modulos lista importar funciones ejecutar desde cómo consola archivos archivo python return-value external-process

script - ¿Cómo llamar a un programa externo en python y recuperar el código de salida y retorno?



lista de modulos de python (5)

Consulte el módulo de subproceso aquí: http://docs.python.org/library/subprocess.html#module-subprocess . Debe obtener lo que necesita hacer.

¿Cómo puedo llamar a un programa externo con un script python y recuperar el código de salida y retorno?


Desarrollé una pequeña biblioteca ( py-execute ) que le permite ejecutar programas externos, recuperar el resultado y el código de ret y, al mismo tiempo, obtener resultados en la consola en tiempo real:

>>> from py_execute.process_executor import execute >>> ret = execute(''echo "Hello"'') Hello >>> ret (0, ''Hello/n'')

Puede evitar imprimir en la consola pasando un simulacro user_io:

>>> from mock import Mock >>> execute(''echo "Hello"'', ui=Mock()) (0, ''Hello/n'')

Lo escribí porque con Popen (en Python 2.7) estaba teniendo problemas para ejecutar comandos con una salida larga


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


Mira el módulo de subprocess : un ejemplo simple sigue ...

from subprocess import Popen, PIPE process = Popen(["ls", "-la", "."], stdout=PIPE) (output, err) = process.communicate() exit_code = process.wait()


Siguiendo el comentario anterior de Ambroz Bizjak, he aquí 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()