2011-11-15 5 views
3

Je veux créer un script batch simple en utilisant python en utilisant os.system. Je suis capable d'exécuter les commandes très bien, mais la sortie de ces commandes ne s'imprime pas sur le shell python. Est-il possible de rediriger la sortie vers le shell python?Python: Comment rediriger la sortie de os.system vers shell Python?

+1

Pourriez-vous montrer un code? Il est difficile de dire ce que vous essayez de faire. –

+3

Vous pourriez essayer d'utiliser le module ['subprocess'] (http://docs.python.org/library/subprocess.html#module-subprocess) au lieu de' os.system', il a de meilleures fonctionnalités (comme rediriger la sortie) – NullUserException

+0

Oui, beaucoup de gens ont suggéré cela, mais je ne peux pas sembler le faire fonctionner. Connaissez-vous un bon exemple étape par étape? Je suis très nouveau à Python et la plupart des exemples que j'ai trouvés supposent que vous savez ce que vous faites. – mtmurdock

Répondre

2

(Reposting comme une réponse à la demande):

os.system() fonctionnera lorsqu'il est exécuté dans un terminal - c'est là stdout va, et tous les processus que vous commencez hériteront que stdout à moins que vous redirigez il.

Si vous devez rediriger vers IDLE, utilisez la réponse @ root45 ci-dessus (mise à jour). Cela fonctionnera pour la plupart des programmes, mais au moins sur les systèmes Unixy, les processus peuvent également accéder directement au terminal dans lequel ils sont exécutés (par exemple pour demander un mot de passe) - Windows peut avoir quelque chose de similaire.

+0

Merci. Je testais mon programme en mode IDLE, ce qui explique pourquoi j'avais des problèmes, mais le programme devait fonctionner dans le shell Unix de toute façon. Dès que je l'ai couru dans la coquille, j'ai vu la sortie très bien. – mtmurdock

7

Vous pouvez utiliser subprocess.

from subprocess import Popen, PIPE 
p1 = Popen(['ls'], stdout=PIPE) 
print p1.communicate()[0] 

Cela affichera le répertoire liste pour le répertoire en cours. La méthode communicate() renvoie un tuple (stdoutdata, stderrdata). Si vous n'incluez pas stdout=PIPE ou stderr=PIPE dans l'appel Popen, vous obtiendrez simplement None. (Ainsi, dans ce qui précède, p1.communicate[1] est None.)

Dans une ligne,

print Popen([command], stdout=PIPE).communicate()[0] 

imprime la sortie de command à la console.

Vous devriez en lire plus here. Il y a beaucoup plus que vous pouvez faire avec Popen et PIPE.

+0

Upvoted, mais finalement pas ce que je cherchais. Merci. – mtmurdock

Questions connexes