Iniciar un proceso en segundo plano en Python
Estoy intentando portar un script de shell a la versión de Python, mucho más legible. El script de shell original inicia varios procesos (utilidades, monitores, etc.) en segundo plano con "&". ¿Cómo puedo lograr el mismo efecto en Python? Me gustaría que estos procesos no mueran cuando se completen los scripts de Python. Estoy seguro de que está relacionado de alguna manera con el concepto de demonio, pero no pude encontrar cómo hacerlo fácilmente.
Si bien la solución de jkp funciona, la forma más nueva de hacer las cosas (y la forma que recomienda la documentación) es utilizar el subprocess
módulo. Para comandos simples es equivalente, pero ofrece más opciones si quieres hacer algo complicado.
Ejemplo para su caso:
import subprocess
subprocess.Popen(["rm","-r","some.file"])
Esto se ejecutará rm -r some.file
en segundo plano. Tenga en cuenta que llamar .communicate()
al objeto devuelto Popen
se bloqueará hasta que se complete, así que no lo haga si desea que se ejecute en segundo plano:
import subprocess
ls_output=subprocess.Popen(["sleep", "30"])
ls_output.communicate() # Will block for 30 seconds
Consulte la documentación aquí .
Además, un punto de aclaración: "Fondo", tal como lo usa aquí, es puramente un concepto de shell; Técnicamente, lo que quieres decir es que deseas generar un proceso sin bloquear mientras esperas a que se complete. Sin embargo, he usado "fondo" aquí para referirme al comportamiento similar al fondo de shell.
Nota : Esta respuesta está menos actualizada que cuando se publicó en 2009. subprocess
Ahora se recomienda usar el módulo que se muestra en otras respuestas en los documentos.
(Tenga en cuenta que el módulo de subproceso proporciona funciones más poderosas para generar nuevos procesos y recuperar sus resultados; es preferible usar ese módulo que usar estas funciones).
Si desea que su proceso comience en segundo plano, puede usarlo system()
y llamarlo de la misma manera que lo hizo su script de shell, o puede spawn
hacerlo:
import os
os.spawnl(os.P_DETACH, 'some_long_running_command')
(o, alternativamente, puede probar la os.P_NOWAIT
bandera menos portátil).
Consulte la documentación aquí .
Probablemente quieras la respuesta a "Cómo llamar a un comando externo en Python" .
El método más sencillo es utilizar la os.system
función, por ejemplo:
import os
os.system("some_command &")
Básicamente, todo lo que pases a la system
función se ejecutará igual que si lo hubieras pasado al shell en un script.