Iniciar un proceso en segundo plano en Python

Resuelto Artem asked hace 15 años • 11 respuestas

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.

Artem avatar Jul 29 '09 01:07 Artem
Aceptado

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 subprocessmó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.fileen segundo plano. Tenga en cuenta que llamar .communicate()al objeto devuelto Popense 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.

Dan avatar Aug 28 '2011 21:08 Dan

Nota : Esta respuesta está menos actualizada que cuando se publicó en 2009. subprocessAhora 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 spawnhacerlo:

import os
os.spawnl(os.P_DETACH, 'some_long_running_command')

(o, alternativamente, puede probar la os.P_NOWAITbandera menos portátil).

Consulte la documentación aquí .

jkp avatar Jul 28 '2009 19:07 jkp

Probablemente quieras la respuesta a "Cómo llamar a un comando externo en Python" .

El método más sencillo es utilizar la os.systemfunción, por ejemplo:

import os
os.system("some_command &")

Básicamente, todo lo que pases a la systemfunción se ejecutará igual que si lo hubieras pasado al shell en un script.

Eli Courtwright avatar Jul 28 '2009 19:07 Eli Courtwright