2017-09-12 6 views
0

J'écris une petite application qui utilise un "fichier d'index" pour ouvrir des dossiers dans l'explorateur à partir de quelques pressions sur un bouton. Quoi qu'il en soit, je voudrais mettre à jour ce fichier d'index dans un "processus d'arrière-plan" chaque fois que les applications s'arrêtent. La mise à jour du fichier d'index implique la numérisation via notre réseau et pour certains utilisateurs distants, cela peut prendre quelques minutes. C'est pourquoi je voudrais qu'il cache la console pendant le processus d'analyse afin d'éviter que le processus ne soit annulé par l'utilisateur.Fermer la console pendant l'exécution du processus

J'ai essayé plusieurs choses semblables à:

#these are just dummy lines 
path = get_user_input() 
subprocess.Popen(r'explorer "%s"' % path) 
#Here I start my update process 
multiprocessing.Process(target=update_index).start() 
#end of script, now I want that process to continue until finished while main console closes. I only seem to get one or the other. 

J'ai aussi essayé d'utiliser:

DETACHED_PROCESS = 0x00000008 
CREATE_NO_WINDOW = 0x08000000 
subprocess.Popen(command, shell=True, stdin=None, stdout=None, 
       stderr=None, 
       creationflags=DETACHED_PROCESS|CREATE_NO_WINDOW) 

et a réussi à obtenir une fenêtre de console séparée mais toujours aucun moyen d'empêcher l'utilisateur de fermer la processus.

Gardez aussi à l'esprit que je voudrais distribuer ce script avec quelque chose comme py2exe plus tard pour le rendre accessible aux personnes sans python, donc je suppose que l'utilisation de pythonw.exe est hors de question. ou?

+0

Le script doit-il normalement avoir une console? Sinon, utilisez un fichier .pyw qui s'exécute avec pythonw.exe. – eryksun

+0

BTW, 'CREATE_NO_WINDOW' est ignoré si vous utilisez également' DETACHED_PROCESS' car cela n'a aucun sens de les combiner. 'DETACHED_PROCESS' est logique pour exécuter une application de console sans console uniquement si elle ne provoque pas les processus de la console enfant car ils créeront simplement leurs propres fenêtres de console. Avec ce drapeau, vous devez également rediriger les poignées standard vers le périphérique 'NUL'. 'CREATE_NO_WINDOW' fonctionne pour les processus fils car ils hériteront de la console sans fenêtre. De même, vous pouvez utiliser 'STARTUPINFO' pour cacher la fenêtre de la console. – eryksun

+0

Oui, le script devrait normalement avoir une console, parce que dans la première partie, l'utilisateur j'ai promis deux questions à répondre. Au moins, c'est comme ça que ça se passe maintenant, une possibilité pourrait être de promettre ces questions dans une autre sorte de fenêtre qu'une console, je vais essayer quand je serai de retour au bureau. En ce qui concerne les drapeaux pour la méthode des sous-processus, je n'ai pas la moindre idée de la façon dont ils fonctionnent. J'ai simplement trouvé les google et essayé différentes combinaisons, merci de m'avoir donné plus de détails! – Saftblandaren

Répondre

0

Ce n'est pas vraiment la réponse que vous recherchez, mais vous pouvez repenser l'architecture de votre système: Ecrivez votre programme de mise à jour d'index en tant que processus serveur communiquant avec votre application réelle via des sockets. Ensuite, le processus du serveur de mise à jour de l'index est exécuté en continu (peut-être même sur une autre machine) et le processus de mise à jour de l'index fait tout le travail qui prend du temps.

+0

Comme vous avez dit pas exactement ce que je cherche. Bien sûr, ça pourrait être une solution, mais je ne voulais pas faire un si gros morceau de ce script. La mise en place d'un tel service implique plus de travail et implique d'autres personnes sur l'entreprise qui sont en mesure d'héberger un tel service. Par rapport à juste avoir un fichier d'index stocké sur le réseau qui est mis à jour lorsqu'il est utilisé. – Saftblandaren

0

Si vous souhaitez effectuer des tâches d'arrière-plan à certains intervalles, utilisez cron. Si vous voulez exécuter une commande en arrière-plan et la maintenir en cours même si vous vous déconnectez de la console, utilisez nohup.

+0

Cette question est balisée pour Windows et le code OP est destiné à Windows (par exemple, exécution d'un "explorateur" et utilisation de "creationflags"). – eryksun