Si desea ejecutar herramientas de línea de comandos como procesos separados, simplemente use os.system
(o mejor: el módulo subprocess
) para iniciarlos de forma asíncrona. En UNIX/Linux/MacOS:
subprocess.call("command -flags arguments &", shell=True)
En Windows:
subprocess.call("start command -flags arguments", shell=True)
En cuanto a saber cuando un comando ha terminado: En Unix que podría ponerse en marcha con wait
etc., pero si usted está escribiendo los scripts de la línea de comandos, simplemente les pido que escriban un mensaje en un archivo y supervisen el archivo desde el script python de la llamada.
@James Youngman propuso una solución a su segunda pregunta: Sincronización. Si desea controlar sus procesos desde python, puede iniciarlos de forma asincrónica con Popen.
p1 = subprocess.Popen("command1 -flags arguments")
p2 = subprocess.Popen("command2 -flags arguments")
Tenga en cuenta que si utiliza Popen y sus procesos de escribir una gran cantidad de datos a la salida estándar, el programa será un punto muerto. Asegúrese de redirigir todo el resultado a un archivo de registro.
p1
y p2
son objetos que puede utilizar para vigilar sus procesos. p1.poll()
no bloqueará, pero devolverá None si el proceso aún se está ejecutando. Devolverá el estado de salida cuando esté listo, para que pueda verificar si es cero.
for proc in [p1, p2]:
time.sleep(60)
status = proc.poll()
if status == None:
continue
elif status == 0:
# harvest the answers
else:
print "command1 failed with status", status
Lo anterior es sólo un modelo: Como está escrito, nunca se cerrará, y que se mantendrá "cosecha" los resultados de los procesos terminados. Pero confío en que entiendas la idea.
Python tiene un buen soporte para [ 'threading'] (http://docs.python.org/library/threading.html) y [' multiprocessing'] (http://docs.python.org/ library/multiprocessing.html). ¿Cuál es el problema específico que tienes con esos? –