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()