Python: Lancez une nouvelle invite de commande sous Windows et attendez la fin / sortie

Je ne comprends pas pourquoi il est si difficile de le faire sous Windows.

Je veux lancer un tas de fenêtres d’invite de commandes qui exécuteront d’autres scripts. La raison pour laquelle je veux ceci est que je peux voir toutes les sorties de chaque script soigneusement (si je les ai juste des threads / sous-processus dans la fenêtre principale, je ne peux pas voir toute la sortie correctement). Je ne veux pas non plus enregistrer la sortie car elle sert principalement à afficher les barres de progression, qui ne fonctionnent pas vraiment avec les fichiers journaux.

Donc, certaines parties de mes exigences fonctionnent, mais pas ensemble:

os.system("start cmd /c {command here}") # Launches in new command prompt, closes when done 

Cependant, os system ne me laissera pas attendre la fin de la commande (puisque start est la commande réelle, la seconde ouvre la nouvelle invite de commandes “done”)

De même si j’essaye:

 p = subprocess.Popen(["start", "cmd", "/k", "{command here}], shell = True) # Needs to be shell since start isn't an executable, its a shell cmd p.wait() # I can wait until finished (although it too finishes after start finishes) 

Alors, comment puis-je faire cela? J’ai lu quelque part qu’une solution pourrait être d’utiliser un groupe de processus, mais ce n’est qu’unix … ou quelque chose comme ça

Ou si vous avez un moyen pratique d’afficher la sortie de tous les sous-processus dans une seule fenêtre, je n’ai pas besoin d’ouvrir une nouvelle invite de commandes et je peux simplement utiliser des threads. Cela fonctionne aussi, mais si je peux, disons 4 threads en train de télécharger quelque chose et d’afficher une barre de progression, ainsi que d’envoyer d’autres informations, je ne sais pas comment les afficher de façon lisible L’un et l’autre).

PS: Ceci est sur Windows Vista. PPS: Je préférerais de préférence une solution qui fonctionne sur Windows, Linux et Mac, je me concentre sur Windows pour le moment mais je voudrais une solution qui fonctionne pour les trois, et je sais que Windows est le plus difficile. Je voudrais juste substituer “le début cmd / c” pour la commande appropriée du système d’exploitation.

En lisant votre commentaire à ma réponse précédente, vous avez besoin de:

 os.system("start /wait cmd /c {command}") 

Gardez la référence de la commande windows toujours à scope de main!

Vous pouvez passer / WAIT à la commande de start pour le faire attendre la fin.

Pour ouvrir une nouvelle fenêtre d’invite de commande, j’utilise:

 os.system("start /B start cmd.exe @cmd /k mycommand...") 

Que diriez-vous

 os.system("cmd /c {command here}") 

Ou même

 os.system("{command here}") 

C’est la commande de démarrage qui lance une session séparée au lieu d’utiliser celle sur laquelle le programme python est exécuté.