2010-11-16 6 views
3

Je suis relativement à python et j'essaye d'écrire un script python auquel on peut diriger la sortie d'une commande ou d'un autre script. Dans le script python, j'analyserai essentiellement la sortie de la commande et l'enregistrerai dans le fichier.Pipe d'une commande ou d'un script vers un autre script python

Je pensais que je serais capable de le faire en redirigeant sys.stdin vers subprocess.PIPE, mais cela n'a pas fonctionné.

sys.stdin = subprocess.PIPE 

Quelqu'un peut-il suggérer comment devrais-je aborder cela?

Également ce qui se passerait si la commande ou le script canalise les données plus rapidement que le script python peut traiter.

Note: Lorsque j'utilise ce script

import sys 
data = sys.stdin.readline() 
print(data) 

Je reçois ce

D:\>echo "test" | tee.py 
The process tried to write to a nonexistent pipe. 
Traceback (most recent call last): 
    File "D:\Profiles\Administrator\My Documents\Workspace\tee.py", line 3, in <mo 
dule> 
    data = sys.stdin.readline() 
AttributeError: 'NoneType' object has no attribute 'readline' 

et quand j'utilise cette

import sys 
data = input() 
print(data) 

Je reçois ce

D:\>echo "test" | tee.py 
The process tried to write to a nonexistent pipe. 
Traceback (most recent call last): 
    File "D:\Profiles\Administrator\My Documents\Workspace\tee.py", line 3, in <mo 
dule> 
    data = input() 
RuntimeError: input(): lost sys.stdin 
+0

Dans votre édition, il semble que vous ayez fait quelque chose de stupide avec 'sys.stdin'. Essayez 'sys .__ stdin__'. – katrielalex

+0

Pouvez-vous élaborer s'il vous plaît? – nik

Répondre

3

On (ancien) Windows lorsque vous utilisez des tuyaux dont vous avez besoin d'appeler des scripts Python en utilisant python exécutable par défaut due to NT redirection bug:

D:\> echo "test" | python tee.py 

Après cette sys.stdin, raw_input(), fileinput.input() devrait fonctionner comme prévu.

1

Vous semblez être un peu flou sur la façon dont les tuyaux fonctionnent. Ils sont gérés par le système d'exploitation, et non par les programmes individuels. Ainsi, si vous écrivez un script Python conçu pour prendre les données d'entrée d'un tuyau, il devrait simplement lire stdin comme d'habitude et la redirection sera gérée pour vous. Les données seront consommées aussi vite qu'elles sont générées; Si le script consomme des données plus lentement qu'elles ne sont générées, elles seront stockées dans un tampon.

Ou vous essayez de communiquer entre deux Scripts Python? Si oui, il y a de meilleurs moyens que par stdin et stdout.

+0

Quels meilleurs moyens recommanderiez-vous? – ThomasH

+0

@Thomas: 1) Placez le gestionnaire de données dans un module et importez-le. 2) Propager un processus séparé et le tuyau. – katrielalex

0

Question 1 (lire à partir d'un tuyau) a été répondu par d'autres: Il suffit de lire stdin dans python_script.py. Le système d'exploitation gère la redirection à travers les tuyaux.

On a également répondu à la question 2 (vitesse d'écriture/de lecture): les tubes OS sont mis en mémoire tampon, donc rien à craindre ici.

Question 3 (les traces de la pile): Votre premier programme fonctionne bien avec moi. - Donnez-vous vraiment le code entier ici? Comme pour subprocess.PIPE: Vous ne voulez vraiment utiliser que si vous commencer une nouvelle commande à partir de votre script Python en cours d'exécution, de sorte que vous pouvez communiquer avec le processus enfant. Comme vous ne le faites pas, cela ne vous sert à rien. Les tuyaux au niveau de la coquille ne constituent pas des processus parent-enfant.

+0

A propos de la trace de la pile, le premier programme ne fonctionne pas pour moi. Sys.stdin.readline() n'est-il pas supporté par Python 3.1? Et oui, ce sont les programmes complets. – nik

+0

Ah, je cours Python 2.6. - Vérifiez les documents. – ThomasH

Questions connexes