Lancer un processus totalement indépendant de Python

j'essaie de lancer un processus complètement indépendant de python. Je ne peux pas utiliser quelque chose de simple comme os.startfile puisque j'ai besoin de passer des arguments. Actuellement, j'utilise le sous-processus.popen qui me fait 90% du chemin.

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)

en utilisant popen avec des drapeaux de création détachés et des pipes pour std * ne commence un nouveau processus qui vit après le processus parent meurt. Donc c'est tout bon. Le problème, c'est que le nouveau processus "enfant" tient toujours une poignée fantôme pour parent. Si j'essaie de désinstaller l'exe parent (mon script python est empaqueté dans un exe via pyinstaller), msiexec se plaint que l'exe parent est toujours utilisé.

donc le but est de générer un processus totalement indépendant pour exécuter" some_exe.exe " qui n'a pas de contrôle sur le processus d'origine.

Note: Ceci est Pour Windows XP et au-dessus. Je développe sur Win7.

27
demandé sur jdotjdot 2012-11-28 00:10:19

2 réponses

je pense que j'ai trouvé la réponse. En utilisant Popen avec close_fds = True j'ai pu démarrer un processus qui était indépendant et sans poignées pour le parent.

Pour les docs look ici et la recherche pour close_fds .

ou, sur Windows, si close_fds est true alors aucun poignées ne sera hérité par le processus de l'enfant. Notez que sur Windows, vous ne pouvez pas définir close_fds à vrai et aussi rediriger l' poignées standard en réglant stdin, stdout ou stderr.

notez que cette solution ne fonctionne que sous Windows. Je n'ai aucune idée à propos de toutes les *nix système.

22
répondu greenhat 2015-05-01 20:38:12

j'ai trouvé ce ici :

sur windows (win xp), le processus parent ne sera pas terminé jusqu'à ce que le longtask.py a terminé son travail. Ce n'est pas ce que vous voulez dans CGI-script. Le problème n'est pas spécifique à Python, dans la communauté PHP les problèmes sont les mêmes.

la solution est de passer DETACHED_PROCESS indicateur de création de processus à la fonction sous-jacente CreateProcess dans win API. Si vous avez installé pywin32, vous pouvez importer le drapeau du module win32process, sinon vous devez le définir vous-même:

DETACHED_PROCESS = 0x000008

pid = sous-processus.Popen ([sys.exécutable, "longtask.py"], creationflags=DETACHED_PROCESS).pid

4
répondu f p 2017-07-27 19:49:38