example check_output python windows-installer popen

check_output - Lanzar un proceso totalmente independiente desde Python.



subprocess check_output example python (2)

Estoy tratando de lanzar un proceso completamente independiente desde Python. No puedo usar algo simple como os.startfile ya que necesito pasar argumentos. Actualmente estoy usando subprocess.popen, que me permite obtener 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 desconectadas para std * inicia un nuevo proceso que se realiza después de que el proceso principal finalice. Así que eso es todo bueno. El problema es que el nuevo proceso ''secundario'' todavía tiene un identificador fantasma para el padre. Por lo tanto, si intento desinstalar el archivo exe principal (mi script de Python se incluye en un archivo ejecutable a través de pyinstaller), msiexec se queja de que el archivo exe todavía está en uso.

Por lo tanto, el objetivo es generar un proceso totalmente independiente para ejecutar "some_exe.exe" que no tenga ningún control sobre el proceso original.

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


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 docs mira here y busca close_fds .

O bien, en Windows, si close_fds es verdadero, el proceso hijo no heredará ningún identificador. Tenga en cuenta que en Windows, no puede establecer close_fds en verdadero y también redirigir los manejadores estándar configurando stdin, stdout o stderr.

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


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