Je suis sur WindowsXP. Cela semble affecter n’importe quel processus, mais j’utiliserai Python3.2 pour le démontrer. Un script, ‘filter.py’:
import sys for line in sys.stdin: print(line)
En cours d’exécution comme ceci:
echo hello | filter.py
Des pauses comme ça:
Traceback (most recent call last): File "F:\Documents and Settings\jhartley\docs\projects\filtercwd\filter.py", line 3, in for line in sys.stdin: TypeError: 'NoneType' object is not iterable
Bien sûr, l’ajout d’une impression pour découvrir la valeur de sys.stdin indique qu’il s’agit de None (et de NoneType).
Sinon, lancez-le comme ceci:
echo hello | python filter.py
(avec une invocation explicite de python) fonctionne parfaitement bien.
Mes fichiers .py sont connectés pour être exécutés à l’aide de Python à l’aide du mécanisme assoc et ftype (la manière dont Windows associe des extensions de nom de fichier particulières à exécuter à l’aide de programmes particuliers):
> assoc .py .py=Python.File > ftype Python.File Python.File="F:\Python32\python.exe" "%1" %*
(c’est le même ‘python.exe’ qui est le premier sur mon chemin)
Mise à jour : Ce n’est pas une chose Python. La même chose se produit si je crée filter.sh, en utilisant cygwin bash. Courir explicitement ‘echo hello | bash filter.sh ‘fonctionne bien, mais’ echo hello | filter.sh ‘qui exécute filter.sh en utilisant bash via le mécanisme assoc et ftype, échoue avec’ / dev / stdin: pas un tel fichier ou répertoire ‘.
Je dois donc append ce “python” explicite à toutes mes lignes de commande? De plus, je suis curieux de savoir pourquoi il se casse. Est-ce juste une particularité de ma machine ou est-ce que d’autres personnes le voient aussi?
Quel echo
utilisez-vous? Avez-vous un utilitaire d’ echo
style UNIX sur votre chemin ou utilisez-vous simplement Microsoft (qui ne fait pas ce que vous voulez)? Que se passe-t-il si vous tapez echo on
à l’invite de commande?
Je cours sous Windows 7 et je n’ai pas pu le reproduire. J’ai un utilitaire d’ echo
style UNIX sur mon chemin. J’ai installé Ruby 1.9.2 et écrit un petit programme dans test.rb
:
while s = $stdin.gets print s end
Le programme s’exécute lorsque je tape l’une de ces commandes:
test.rb
ruby test.rb
echo hello | test.rb
echo hello | ruby test.rb
Les commandes 1 et 2 se comportent de manière identique. Les commandes 3 et 4 se comportent de manière identique. Tout se comporte comme prévu.
EDIT 1: Voici quelques commandes que j’ai exécutées:
C:\Users\David\Documents\scraps\test_ruby>ls test.rb C:\Users\David\Documents\scraps\test_ruby>assoc .rb File association not found for extension .rb C:\Users\David\Documents\scraps\test_ruby>echo hi | test.rb hi
Je ne sais pas grand chose sur ftype, mais vous devriez peut-être installer Ruby sur votre système et voir si mon exemple de programme fonctionne pour vous.