manager - Cómo generar un nuevo proceso independiente en Python
pool python example (2)
Tengo un código de Python que ocasionalmente necesita abarcar un nuevo proceso para ejecutar un script de shell de manera "disparar y olvidar", es decir, sin bloquear. El script de shell no se comunicará con el código Python original y, de hecho, probablemente terminará el proceso de Python de llamada, por lo que el script de shell iniciado no puede ser un proceso secundario del proceso de Python de llamada. Necesito que se lance como un proceso independiente.
En otras palabras, digamos que tengo mycode.py y que inicia script.sh. Entonces mycode.py continuará procesando sin bloquear. El script script.sh hará algunas cosas de forma independiente y, en realidad, detendrá y reiniciará mycode.py. Por lo tanto, el proceso que ejecuta script.py debe ser completamente independiente de mycode.py. ¿Cómo puedo hacer esto exactamente? Creo que subprocess.Popen no se bloqueará, pero seguirá creando un proceso secundario que finaliza tan pronto como se detiene mycode.py, que no es lo que quiero.
Intente añadir " nohup " a script.sh. Probablemente deba decidir qué hacer con stdout y stderr; Simplemente lo dejo en el ejemplo.
import os
from subprocess import Popen
devnull = open(os.devnull, ''wb'') # Use this in Python < 3.3
# Python >= 3.3 has subprocess.DEVNULL
Popen([''nohup'', ''script.sh''], stdout=devnull, stderr=devnull)
Sólo tiene que utilizar subprocess.Popen. Lo siguiente funciona bien para mí en Windows XP / Windows 7 y Python 2.5.4, 2.6.6 y 2.7.4. Y después de ser convertido con py2exe, no probado 3.3, surge la necesidad de eliminar el software de prueba caducado en la máquina del cliente .
import os
import subprocess
import sys
from tempfile import gettempdir
def ExitAndDestroy(ProgPath):
""" Exit and destroy """
absp = os.path.abspath(ProgPath)
fn = os.path.join(gettempdir(), ''SelfDestruct.bat'')
script_lines = [
''@rem Self Destruct Script'',
''@echo ERROR - Attempting to run expired test only software'',
''@pause'',
''@del /F /Q %s'' % (absp),
''@echo Deleted Offending File!'',
''@del /F /Q %s/n'' % (fn),
#''@exit/n'',
]
bf = open(fn, ''wt'')
bf.write(''/n''.join(script_lines))
bf.flush()
bf.close()
p = subprocess.Popen([fn], shell=False)
sys.exit(-1)
if __name__ == "__main__":
ExitAndDestroy(sys.argv[0])