web-dev-qa-db-fra.com

Comment puis-je générer de nouveaux shells pour exécuter des scripts Python à partir d'un script de base Python?

J'ai exécuté avec succès plusieurs scripts Python, en les appelant à partir d'un script de base à l'aide du module de sous-processus:

subprocess.popen([sys.executable, 'script.py'], Shell=True)

Cependant, chacun de ces scripts exécute certaines simulations (fichiers .exe à partir d'une application C++) qui génèrent une sortie vers le shell. Toutes ces sorties sont écrites dans le shell de base à partir duquel j'ai lancé ces scripts. Je voudrais générer un nouveau Shell pour chaque script. J'ai essayé de générer de nouveaux shells en utilisant le Shell=True attribut lors de l'appel de subprocess.call (également essayé avec popen), mais cela ne fonctionne pas.

Comment obtenir un nouveau Shell pour chaque processus généré avec subprocess.call?

Je lisais la documentation sur stdin et stdout comme suggéré par Spencer et j'ai trouvé un indicateur qui a résolu le problème: subprocess.CREATE_NEW_CONSOLE. Peut-être que la redirection des tuyaux fait aussi l'affaire, mais cela semble être la solution la plus simple (au moins pour ce problème spécifique). Je viens de le tester et j'ai parfaitement fonctionné:

subprocess.popen([sys.executable, 'script.py'], creationflags = subprocess.CREATE_NEW_CONSOLE)
29
emiguel

Popen génère déjà un sous-processus pour gérer les choses. Il vous suffit de rediriger les tubes de sortie. Regardez la documentation sous-processus , en particulier la section sur la redirection popen stdin, stdout et stderr.

Si vous ne redirigez pas ces canaux, il les hérite du parent. Faites juste attention au blocage de vos processus.

Vous vouliez des fenêtres supplémentaires pour chaque sous-processus. Ceci est également géré. Regardez la section startupinfo du sous-processus. Il explique quelles options définir sur Windows pour générer un nouveau terminal pour chaque sous-processus. Notez qu'il nécessite l'utilisation de l'option Shell = True.

10
Spencer Rathbun

Pour ouvrir dans une autre console, faites (testé sur Windows 7/Python 3):

from sys import executable
from subprocess import Popen, CREATE_NEW_CONSOLE

Popen([executable, 'script.py'], creationflags=CREATE_NEW_CONSOLE)

input('Enter to exit from this launcher script...')
42
Pedro Vagner

Cela ne répond pas vraiment à votre question. Mais j'ai aussi eu mes problèmes avec le sous-processus, et pexpect s'est avéré vraiment utile.

2
Manuel Leuenberger