comment lancer une fenêtre de commande à partir de Python

Je voudrais utiliser la version 2.6 de Python sur Windows pour lancer plusieurs séparé de commande windows, exécutant chacun leur propre script Python. Le but est: ce sont des clients, et je suis en train de charger le serveur de requêtes à partir de plusieurs quasi-indépendant des clients.

Je n'ai pas besoin de communiquer avec le client pendant ou après la course, mais j'ai besoin d'envoyer à chacun un commmandline arg, et j'aimerais que chaque client est sortie pour faire défiler dans son propre "console".

À partir de la ligne de commande DOS, le "début" de la commande fait ce que je voudrais. Je peux soit:

start perf_test.py 2

ou

start cmd /c perf_test.py 3

ou

start cmd /c python perf_test.py 4

(Il va travailler pour vous si vous avez votre fichier "associations" de l'installation correctement.py fichiers. Il y a d'autres fils sur ce, si vous avez besoin d'aide. Ou, utiliser les chemins d'accès complets à l'python exe et/ou de votre script.)

Mon défi, c'est: Comment puis-je obtenir le même effet, à partir de Python?

À l'aide de subprocess bibliothèque, j'ai essayé de variations comme ceci:

from subprocess import *
p = Popen(["perf_test.py", "4"], shell=True, stdin=PIPE)

Mais même avec shell=True, la sortie est mélangée dans la fenêtre, je suis déjà en cours d'exécution. L'ajout de stdout=PIPE s'arrête, mais puis-je le lire p.stdout ou de l'utilisation p.communicate(). L'ajout de "cmd" pour le Popen obtient environ le même:

p = Popen(["cmd", "/c", "perf_test.py", "4"], shell=True, stdin=PIPE)

Aucune de parvenir à l'effet, je suis à la recherche, qui est: "pop ouvrir une nouvelle fenêtre distincte pour ce script, et de regarder sa sortie défiler dans sa propre console" (parce que je veux vraiment courir N de ces clients en parallèle).

Une autre chose que je me suis tourné vers presque œuvres, trop.

import os
os.startfile("perf_test.py")

Cela renvoie immédiatement, et une réelle dosbox pop-up. Yay!!! Succès! C'est, jusqu'à ce que j'essaie d'ajouter un argument. Cette échoue:

os.startfile("perf_test.py 5")

avec message d'erreur "Le système ne peut pas trouver le fichier spécifié"... parce que c'est l'ajout de "[ESPACE]5" pour le nom de fichier. (Le but de l'argument est que chaque "perf_test" doit avoir une identification attribué, de sorte que ils ont frappé le serveur que les différentes instances.)

D'autres approches que j'ai vu, et n'aime vraiment pas, pour diverses raisons:

  • Exécuter chaque "perf_test" dans son propre thread. (Mais j'ai vraiment envie de voir la sortie de chacun dans sa propre console.)
  • Faire mon propre pseudo-consoles, avec les Savoirs traditionnels. (Figure je vais frapper les différents problèmes de threading).
  • Dynamiquement écrire un .Fichier BAT à la volée avec les lignes "démarrer perf_test.py 1", "start perf_test.py 2", etc., puis de le lancer .Fichier BAT avec Popen ou startfile.

J'attends le dernier... et je suppose que c'est mon dernier recours, si je ne peux pas obtenir un script Python pour le faire directement.

Merci pour toute entrée /points de vue!

Voulez-vous chaque console à rester ouvert après le script Python fin de l'exécution?

OriginalL'auteur Dan H | 2012-10-05