Subprocess.Popen (): cache le shell cmd

J’essaye d’appeler un exécutable au démarrage, qui appellera un autre exécutable lui-même. Pour la première partie, j’ai simplement ajouté le chemin d’access à l’exécutable vers HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run , qui fonctionne, mon exécutable est appelé au démarrage.

Ce dernier contient, entre autres, ces lignes:

 startupinfo = subprocess.STARTUPINFO() startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW startupinfo.wShowWindow = subprocess.SW_HIDE proc = subprocess.Popen(command, startupinfo=startupinfo) 

Cependant, un shell de commande (cmd) apparaît lorsque l’ordinateur démarre. Tout fonctionne bien, mais il est visible au lieu d’être caché … Alors, comment cacher ce shell de commande?

Lorsque vous utilisez ProcessExplorer , j’ai la hiérarchie suivante:

 + System |_ Interrupts |_ smss.exe |_ some processes... + explorer.exe |_ some processes... |_ MYSCRIPT.EXE 

Voici la séquence que j’essaie de réaliser:

  • Je crée un fichier ISO contenant tous les exécutables Python que je veux exécuter sur la VM. L’un d’eux ( master.exe ) appelle les autres.
  • Je crée une VM qui monte automatiquement cette dernière
  • La machine virtuelle, qui a été préparée, a une tâche planifiée qui appelle D:\master.exe
  • master.exe (parmi d’autres tâches qui ne nous concernent pas ici) ajoute la valeur D:\myscript.exe à HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
  • La VM redémarre
  • D:\myscript.exe est exécuté (et fonctionne D:\myscript.exe ), mais il s’exécute dans une invite de commande, que je voudrais être invisible.

C’est un problème typique rencontré par les programmeurs Python – et par conséquent, une solution est proposée par Python lui-même. Il a été demandé à plusieurs resockets, par exemple ici , mais pour vous, le problème est un peu plus compliqué.

Il s’agit de savoir si vous utilisez python.exe ou pythonw.exe pour exécuter votre script. Pour la première, une console est ouverte, pour la seconde ce n’est pas le cas.

Lorsque vous utilisez des scripts compilés, vous devez indiquer “le compilateur” la version que vous souhaitez utiliser. En supposant que vous utilisez py2exe, vous pouvez consulter ce post sur SO . Ici, on explique en détail comment procéder.

La fenêtre de la console en cours d’ouverture appartient probablement au processus Python exécutant votre script. Montrez-nous l’entrée dans le registre exécutant votre script.

Si vous exécutez un programme de console, Windows créera une fenêtre de console. “python.exe” est un programme de console.

Si vous ne voulez pas de fenêtre de console, vous pouvez exécuter votre script Python avec “pythonw.exe” plutôt que “python.exe”.

Vous pouvez le comstackr au format exe. Lorsque je rencontre ce problème, j’ai utilisé py2exe pour comstackr le fichier python en exécutable invisible.

Tout ce que vous avez à faire est de changer le fichier setup.py (utilisé pour comstackr), à partir de

 setup(console=['__main__.py'], options={"py2exe":{"includes":["sip"]}}) 

à

 setup(windows=['__main__.py'], options={"py2exe":{"includes":["sip"]}}) 

J’ai eu le même problème et j’ai utilisé Pyinstaller .

Pyinstaller est un outil intelligent multi-plateformes pour comstackr des fichiers .py en fichiers exécutables autonomes.

Installez-le via:

pip install pyinstaller (plus d’informations ici )

Utilisez la commande suivante pour masquer la console (pour que votre script devienne un processus):

 pyinstaller yourfilename.py -F --windowed 

(avec l’option “-F”, vous obtiendrez un seul fichier .exe et avec l’option “–windowed”, la console sera cachée)