2009-01-21 10 views
11

J'essaie quelque chose comme çaPython sur Windows: Pourquoi cela ne fonctionne-t-il pas?

Output.py

print "Hello" 

Input.py

greeting = raw_input("Give me the greeting. ") 
print "The greeting is:", greeting 

Sur la ligne cmd

Output.py | Input.py 

Mais il retourne un EOFError. Quelqu'un peut-il me dire ce que je fais mal?

Merci pour votre aide.

EDIT
Patrick Harrington solution œuvres mais je ne sais pas pourquoi ...

+0

Cela fonctionne dans Python 3.0. –

+0

C'est-à-dire que j'ai utilisé l'entrée (..) au lieu de raw_input (..) –

+0

J'ai mis à jour ma réponse pour expliquer pourquoi la solution proposée par Patrick et moi fonctionne et non l'original. – Jay

Répondre

23

Je l'ai testé sur mon ordinateur Windows et il fonctionne si vous spécifiez l'exe Python:

C:\>C:\Python25\python.exe output.py | C:\Python25\python.exe input.py 
Give me the greeting. The greeting is: hello 

Mais je reçois également une erreur EOFError si j'exécute directement les commandes:

output.py | input.py 

Je ne sais pas exactement pourquoi c'est, je suis toujours en train de regarder dans celui-ci, mais au moins cela devrait vous fournir une solution de contournement pour le moment. Cela peut avoir quelque chose à voir avec la manière dont le gestionnaire de fichiers est appelé pour les fichiers .py.

MISE À JOUR: bien, que savez-vous? On dirait que c'est en fait un bogue dans Windows où la redirection stdin/stdout peut ne pas fonctionner correctement lorsqu'elle est démarrée à partir d'une association de fichiers. Donc, la solution de contournement est telle que notée par moi-même et Patrick, vous devez spécifier "python" exécutera input.py, sinon il ne redirigera pas stdout de output.py vers stdin pour input.py correctement.

Référence:

http://mail.python.org/pipermail/python-bugs-list/2004-August/024923.html

http://support.microsoft.com/default.aspx?kbid=321788

MISE À JOUR 2:

Pour changer ce comportement et faire des pipes de Windows fonctionnent comme prévu pour stdin/stdout redirection, vous pouvez ajouter cette valeur au registre (testé sur ma boîte et vérifié que cela fonctionne comme vous le souhaitez).

  1. Démarrez l'Éditeur du Registre.
  2. Recherchez et cliquez sur la clé suivante dans le Registre:

    HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows \ CurrentVersion \ Policies \ Explorer

  3. Dans le menu Edition, cliquez sur Ajouter une valeur, puis ajoutez la valeur de registre suivante:

    nom de la valeur: InheritConsoleHandles
    Type de données: RE G_DWORD
    Radix: décimal
    Données de la valeur: 1

  4. Quit l'Éditeur du Registre.

+1

Il est à noter que vous pouvez maintenant ajouter la valeur 'InheritConsoleHandles' au registre Windows pour utiliser' output.py | input.py' comme décrit dans la page microsoft.com liée. – jfs

+0

bon point, fera – Jay

4

Modifier à:

Output.py | python Input.py 

La sortie sera:

Donne-moi le salut. Le message d'accueil est: bonjour

+0

pourquoi cela fonctionne-t-il mais en laissant python ne fonctionne pas? – Nope

+0

Voir ma réponse pour la raison pour laquelle cela fonctionne. – Jay

0

Voici pourquoi vous obtenez le EOFError (à partir de la documentation sur raw_input):

La fonction lit ensuite une ligne d'entrée , il se convertit en une chaîne (stripping un retour chariot), et renvoie cela. Lorsque EOF est lu, EOFError est déclenché.

http://docs.python.org/library/functions.html?highlight=raw_input#raw_input

Vous pouvez utiliser sys.stdin, il fournit un objet de fichier à partir duquel vous pouvez utiliser la lecture, les méthodes readlines.

import sys 
for greeting_line in sys.stdin.readlines(): 
    print "The greeting is:", greeting_line.strip()