¿Cómo llamar a un progtwig externo en Python y recuperar el código de salida y retorno?

¿Cómo puedo llamar a un progtwig externo con una secuencia de comandos de python y recuperar el código de salida y retorno?

Mira el módulo de subproceso : 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, aquí hay 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() 

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

Después de algunas investigaciones, tengo el siguiente código que funciona muy bien para mí. Básicamente imprime tanto stdout como stderr en tiempo real. Espero que ayude a alguien 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 le permite ejecutar progtwigs externos, recuperar la salida y el código de retorno y, al mismo tiempo, obtener la salida en la consola en tiempo real:

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

Puedes evitar imprimir en la consola pasando un user_io falso:

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

Lo escribí porque con Popen normal (en Python 2.7) tenía problemas para ejecutar comandos con una salida larga