stdin est manquant pour tout processus dans lequel je pousse et qui utilise le ftype et le mécanisme d’assoc de Windows pour sélectionner le bon exécutable

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:

  1. test.rb
  2. ruby test.rb
  3. echo hello | test.rb
  4. 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.