5

私はWindowsXPを使用しています。これはどのプロセスにも影響するようですが、Python3.2 を使用して説明します。スクリプト「filter.py」:

import sys
for line in sys.stdin:
    print(line)

次のように実行します。

echo hello | filter.py

このように壊れます:

Traceback (most recent call last):
  File "F:\Documents and Settings\jhartley\docs\projects\filtercwd\filter.py", line 3, in <module>
    for line in sys.stdin:
TypeError: 'NoneType' object is not iterable

案の定、sys.stdin の値を検出するために print を追加すると、それが None (および NoneType) であることが報告されます。

または、次のように実行します。

echo hello | python filter.py

(pythonの明示的な呼び出しを使用して)完全に正常に動作します。

私の .py ファイルは、assoc および ftype メカニズム (特定のプログラムを使用して実行される特定のファイル名拡張子を Windows が関連付ける方法) を使用して、Python を使用して実行するように接続されています。

> assoc .py
.py=Python.File
> ftype Python.File
Python.File="F:\Python32\python.exe" "%1" %*

(これは、私のパスで最も重要な「python.exe」と同じです)

更新: これは Python の問題ではありません。filter.sh を作成し、cygwin bash を使用して実行すると、同じことが起こります。'echo hello | 明示的に実行する bash filter.sh' は問題なく動作しますが、'echo hello | assoc および ftype メカニズムを介して bash を使用して filter.sh を実行する filter.sh は、「/dev/stdin: No such file or directory」で失敗します。

それで、この明示的な「python」をすべてのコマンドラインに追加する必要がありますか? さらに、なぜ壊れているのか気になります。それは私のマシンの特殊性ですか、それとも他の人もこれを見ていますか?

4

1 に答える 1

1

echoを使っていますか?パスにUNIX スタイルのechoユーティリティがありますか、それとも単に Microsoft のユーティリティを使用しているだけですか (これでは目的が達成されません)。echo onコマンド プロンプトで入力するとどうなりますか?

Windows 7 で実行していますが、これを再現できませんでした。パスにUNIX スタイルのechoユーティリティがあります。Ruby 1.9.2 をインストールし、小さなプログラムをtest.rb次のように記述しました。

while s = $stdin.gets
  print s
end

これらのコマンドのいずれかを入力すると、プログラムが実行されます。

  1. test.rb
  2. ruby test.rb
  3. echo hello | test.rb
  4. echo hello | ruby test.rb

コマンド 1 と 2 は同じように動作します。コマンド 3 と 4 は同じように動作します。すべてが期待どおりに動作します。

編集1: ここに私が実行したいくつかのコマンドがあります:

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

ftype についてはよくわかりませんが、システムに ruby​​ をインストールして、サンプル プログラムが機能するかどうかを確認してください。

于 2011-07-10T16:34:28.250 に答える