Comment faire pour démarrer le processus de démon de python sur windows?
Mon script python frayer un processus qui va s'exécuter indéfiniment?
Je ne suis pas trop familier avec python, ni avec la ponte deamons, donc je cam ceci:
si = subprocess.STARTUPINFO()
si.dwFlags = subprocess.CREATE_NEW_PROCESS_GROUP | subprocess.CREATE_NEW_CONSOLE
subprocess.Popen(executable, close_fds = True, startupinfo = si)
Le processus continue de s'exécuter passé python.exe, mais il est fermé dès que je ferme la fenêtre cmd.
- Voir ici: stackoverflow.com/a/2974177/222914
Vous devez vous connecter pour publier un commentaire.
À l'aide de la réponse Janne Karila a souligné ce est comment vous pouvez exécuter un processus qui ne débite pas mourir quand sa mère meurt, pas besoin d'utiliser le
win32process
module.DETACHED_PROCESS
est un Création D'Un Processus De Drapeau qui est transmis à la sous-jacentes CreateProcess fonction.Cette question a été posée il y a 3 ans, et même si les fondamentaux de détails de la réponse n'a pas changé, compte tenu de sa prévalence dans "Windows Python démon" des recherches, j'ai pensé qu'il pourrait être utile d'ajouter un peu de discussion pour le bénéfice des générations futures Google arrivees.
Il y a deux parties à la question:
La réponse à la première est sans équivoque: oui, comme l'a déjà souligné; à l'aide de
subprocess.Popen
avec lecreationflags=subprocess.CREATE_NEW_PROCESS_GROUP
mot suffira:Noter que, au moins dans mon expérience,
CREATE_NEW_CONSOLE
n'est pas nécessaire ici.Cela étant dit, le comportement de cette stratégie n'est pas tout à fait la même chose que ce que vous attendez d'un démon Unix. Ce qui constitue un bien comportés Unix démon est explique mieux ailleurs, mais pour résumer:
os.umask
dans le Python monde)STDIN
,STDOUT
, etSTDERR
à différents cours d'eau (souventDEVNULL
), et de prévenir la ré-acquisition d'un terminal de contrôleSIGTERM
.La réalité de la situation est que Windows, comme un système d'exploitation ne supporte pas l'idée d'un démon: les applications qui démarrent à partir d'un terminal (ou dans tout autre contexte interactif, y compris le lancement de l'Explorateur, etc) de continuer à fonctionner avec une fenêtre visible, à moins que l'application de contrôle (dans cet exemple, Python) a inclus une fenêtre de l'interface graphique. En outre, Windows de traitement de signal est très insuffisante, et tente d'envoyer des signaux à un indépendant Python processus (par opposition à un sous-processus, qui ne survivrait pas à la borne de fermeture) sera presque toujours dans l'immédiat, la sortie de Python processus sans nettoyage (pas de
finally:
, pas deatexit
, pas de__del__
, etc).Roulement de votre application dans un service Windows, si une alternative viable dans de nombreux cas, n'a pas également tout à fait adapté. La même chose est vraie de l'aide
pythonw.exe
(un sans fenêtre de la version de Python qui est livré avec tous les récente de Windows Python binaires). En particulier, ils ne parviennent pas à améliorer la situation pour le traitement du signal, et ils ne peuvent pas facilement lancer une application à partir d'un terminal et d'interagir avec elle pendant le démarrage (par exemple, de livrer dynamique arguments de démarrage de votre script, disons, peut-être, un mot de passe, chemin du fichier, etc), avant "daemonizing". En outre, les services Windows nécessite l'installation, qui, bien que parfaitement possible de le faire rapidement lors de l'exécution lorsque vous appelez vos "démon" -- modifie le système de l'utilisateur de la base de registre, etc), ce qui serait très inattendu, si vous venez d'un monde Unix.À la lumière de cela, je dirais que le lancement d'un
pythonw.exe
sous-processus à l'aide desubprocess.CREATE_NEW_PROCESS_GROUP
est probablement le plus proche équivalent Windows pour un Python processus d'émuler un Unix traditionnel démon. Cependant, il vous reste le défi supplémentaire de traitement de signal de démarrage et des communications (pour ne pas mentionner faire de votre code qui dépend de la plateforme, ce qui est toujours frustrant).Cela étant dit, pour ceux qui rencontre ce problème dans le futur, j'ai roulé une bibliothèque appelée daemoniker qui englobe à la fois la bonne Unix daemonization et la stratégie ci-dessus. Il met également en œuvre de traitement de signal (pour Unix et les systèmes Windows), et permet de passer des objets à la "démon" processus à l'aide de cornichon. Le meilleur de tous, il a un croix-plate-forme de l'API:
Pour que vous pourrait daemonize votre python ou en tant que vous utilisez l'environnement de windows que vous souhaitez exécuter ce en tant que service windows.
Vous savez que j'aime à la haine afficher seulement les liens web:
Mais pour plus d'informations en fonction de vos besoins:
Un moyen simple de mettre en œuvre un Service Windows. lire tous les commentaires, il va résoudre tout doute
Si vous voulez vraiment en savoir plus
Lisez d'abord cette
qu'est-ce que processus de démon ou créer-un-daemon-le-python-chemin
mise à jour:
Sous-processus n'est pas la bonne façon de réaliser ce genre de chose