Python sur Windows: Pourquoi cela ne fonctionne-t-il pas?
Question
J'essaie quelque chose comme ça
Output.py
print "Hello"
Input.py
greeting = raw_input("Give me the greeting. ")
print "The greeting is:", greeting
À la ligne de commande
Output.py | Input.py
Mais il retourne un EOFError . Quelqu'un peut-il me dire ce que je fais mal?
Merci de votre aide.
MODIFIER
Patrick Harrington, la solution fonctionne mais je ne le fais pas Je ne sais pas pourquoi ...
La solution
J'ai testé cela sur ma machine Windows et cela 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 les commandes sont exécutées directement en tant que:
output.py | input.py
Je ne sais pas exactement pourquoi, je suis toujours à la recherche de celui-ci mais au moins, cela devrait vous fournir une solution de contournement pour le moment. Cela peut avoir quelque chose à voir avec la façon dont le gestionnaire de fichiers est appelé pour les fichiers .py.
MISE À JOUR : que savez-vous? Cela ressemble 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 celle indiquée par Patrick et moi-même, vous devez spécifier "python". exécutera input.py, sinon la redirection stdout de output.py ne sera pas redirigée vers stdin pour input.py correctement.
Référence :
http: //mail.python .org / pipermail / python-bugs-list / 2004-août / 024923.html
http://support.microsoft.com/default.aspx?kbid = 321788
UPDATE 2 :
Pour modifier ce comportement et faire en sorte que les canaux Windows fonctionnent comme prévu pour la redirection stdin / stdout, vous pouvez ajouter cette valeur au registre (testé sur ma machine et vérifié que cela fonctionne comme prévu).
- Démarrez l'Éditeur du Registre.
Recherchez, puis cliquez sur la clé suivante dans le registre:
HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows \ CurrentVersion \ Policies \ Explorer
Dans le menu Edition, cliquez sur Ajouter une valeur, puis ajoutez les éléments suivants valeur de registre:
Nom de la valeur: InheritConsoleHandles
Type de données: REG_DWORD
Radix: décimal
Données de la valeur: 1Quittez l'Éditeur du Registre.
Autres conseils
Changez-le en:
Output.py | python Input.py
Le résultat sera:
Donnez-moi la salutation. La salutation est: bonjour
Voici pourquoi vous obtenez l'erreur EOFError (indiquée dans la documentation sur raw_input):
La fonction lit alors une ligne de input, le convertit en chaîne (suppression d'une nouvelle ligne), et retourne ça. Quand 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 fichier à partir duquel vous pouvez utiliser les méthodes read, readlines.
import sys
for greeting_line in sys.stdin.readlines():
print "The greeting is:", greeting_line.strip()