como - python ejecutar en segundo plano
¿Cómo iniciar un proceso en segundo plano en Python? (6)
Encontré esto here :
En windows (win xp), el proceso padre no terminará hasta que longtask.py
haya terminado su trabajo. No es lo que quieres en CGI-script. El problema no es específico de Python, en la comunidad PHP los problemas son los mismos.
La solución es pasar el indicador de creación de proceso DETACHED_PROCESS
a la función CreateProcess
subyacente en la API win. Si tiene instalado pywin32, puede importar el indicador desde el módulo win32process, de lo contrario, debe definirlo usted mismo:
DETACHED_PROCESS = 0x00000008
pid = subprocess.Popen([sys.executable, "longtask.py"],
creationflags=DETACHED_PROCESS).pid
Estoy tratando de 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 con el concepto de demonio de alguna manera, pero no pude encontrar cómo hacerlo fácilmente.
Probablemente desee comenzar a investigar el módulo os para forzar diferentes hilos (abriendo una sesión interactiva y emitiendo ayuda (os)). Las funciones relevantes son fork y cualquiera de las ejecutivas. Para darle una idea de cómo comenzar, ponga algo como esto en una función que realice la bifurcación (la función necesita tomar una lista o tupla ''args'' como argumento que contiene el nombre del programa y sus parámetros; también puede desear para definir stdin, out y errar para el nuevo hilo):
try:
pid = os.fork()
except OSError, e:
## some debug output
sys.exit(1)
if pid == 0:
## eventually use os.putenv(..) to set environment variables
## os.execv strips of args[0] for the arguments
os.execv(args[0], args)
Probablemente desee la respuesta a "Cómo llamar un comando externo en Python" .
El enfoque más simple es usar la función os.system
, por ejemplo:
import os
os.system("some_command &")
Básicamente, todo lo que pase a la función del system
se ejecutará de la misma manera que si lo hubiera pasado al shell en un script.
Si jkp la solución de jkp funciona, la forma más nueva de hacer las cosas (y la forma en que la documentación recomienda) es utilizar el módulo de subprocess
. Para comandos simples es su equivalente, pero ofrece más opciones si desea hacer algo complicado.
Ejemplo para su caso:
import subprocess
subprocess.Popen(["rm","-r","some.file"])
Esto debería ejecutar rm -r somefile
en segundo plano. Pero tenga cuidado: subprocess.Popen()
solo ejecuta un proceso en segundo plano si nada en el script de python depende de la salida del comando que se ejecuta:
Por ejemplo, el siguiente comando no se ejecutará en segundo plano:
import subprocess
ls_output=subprocess.Popen(["ls", "-a"], stdout=subprocess.PIPE)
Vea la documentación here .
También, un punto de aclaración: "Fondo" puramente un concepto de shell: lo que probablemente desee es generar un nuevo proceso. He usado "fondo" aquí para referirme a un comportamiento similar a un fondo de shell, pero no confunda esto con el proceso que realmente está en segundo plano.
Use subprocess.Popen()
con el parámetro close_fds=True
, que permitirá que el subproceso generado se separe del propio proceso de Python y continúe ejecutándose incluso después de que Python salga.
https://gist.github.com/yinjimmy/d6ad0742d03d54518e9f
import os, time, sys, subprocess
if len(sys.argv) == 2:
time.sleep(5)
print ''track end''
if sys.platform == ''darwin'':
subprocess.Popen([''say'', ''hello''])
else:
print ''main begin''
subprocess.Popen([''python'', os.path.realpath(__file__), ''0''], close_fds=True)
print ''main end''
Nota : Esta respuesta es menos actual de lo que era cuando se publicó en 2009. Ahora se recomienda usar el módulo de subprocess
se muestra en otras respuestas en los documentos.
(Tenga en cuenta que el módulo de subproceso proporciona instalaciones más potentes para generar nuevos procesos y recuperar sus resultados; es preferible utilizar ese módulo a usar estas funciones).
Si desea que su proceso se inicie en segundo plano, puede usar system()
y llamarlo de la misma forma que lo hizo su script de shell, o puede spawn
:
import os
os.spawnl(os.P_DETACH, ''some_long_running_command'')
(O, alternativamente, puede probar el indicador os.P_NOWAIT
menos portátil).
Vea la documentación aquí .