Lanzar un proceso totalmente independiente desde Python


Estoy intentando lanzar un proceso completamente independiente desde python. No puedo usar algo simple como el sistema operativo.startfile ya que necesito pasar argumentos. Actualmente estoy usando subproceso.popen que me lleva el 90% del camino.

args = ["some_exe.exe", "some_arg", "another_arg"]
subprocess.Popen(args, creationflags=DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)

El uso de popen con banderas y tuberías de creación separadas para std* inicia un nuevo proceso que vive después de que el proceso padre muere. Así que todo está bien. El problema es que el nuevo proceso 'hijo' todavía tiene un controlador fantasma para el padre. Así que si trato de desinstalar el exe padre (mi script python está incluido en un exe a través de pyinstaller) msiexec se queja de que el exe padre todavía está en uso.

Así que el objetivo es generar un proceso totalmente independiente para ejecutar "some_exe.exe " que no tiene ningún control de vuelta al proceso original.

Nota: Esto es para Windows XP y superior. Estoy desarrollando en Win7.

Author: jdotjdot, 2012-11-28

2 answers

Creo que encontré la respuesta. Al usar Popen con close_fds = True pude iniciar un proceso que era independiente y sin controladores para el padre.

Para los documentos mira aquí y busca close_fds.

O, en Windows, si close_fds es true, entonces no se heredarán los controladores por el proceso del niño. Tenga en cuenta que en Windows, no puede establecer close_fds a true y también redirigir los controladores estándar mediante el establecimiento de stdin, stdout o stderr.

Tenga en cuenta esto la solución solo funciona en Windows. No tengo idea de ningún sistema *nix.

 22
Author: greenhat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-01 20:38:12

Encontré esto aquí :

En Windows (win xp), el proceso padre no terminará hasta que longtask.py ha 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 DETACHED_PROCESS Process Creation Flag a la función subyacente CreateProcess en la API win. Si tiene instalado pywin32, puede importar la bandera desde el módulo win32process, de lo contrario debe definirlo usted mismo:

DETACHED_PROCESS = 0x00000008

Pid = subproceso.Popen ([sys.ejecutable, "longtask.py"], creationflags=DETACHED_PROCESS).pid

 4
Author: f p,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-27 19:49:38