对于我使用Windows ftype和assoc机制选择正确的可执行文件的任何进程,都缺少stdin

Jon*_*ley 5 windows stdin pipe file-association

我在WindowsXP上.这似乎影响了任何进程,但我将使用Python3.2来演示它.一个脚本'filter.py':

import sys
for line in sys.stdin:
    print(line)
Run Code Online (Sandbox Code Playgroud)

像这样运行:

echo hello | filter.py
Run Code Online (Sandbox Code Playgroud)

像这样打破:

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
Run Code Online (Sandbox Code Playgroud)

果然,添加一个print来发现sys.stdin的值会报告它是None(和NoneType.)

或者,像这样运行它:

echo hello | python filter.py
Run Code Online (Sandbox Code Playgroud)

(使用python的显式调用)工作完全正常.

我的.py文件被连接起来使用关联和ftype机制使用Python执行(Windows关联特定文件扩展名的方式使用特定程序执行):

> assoc .py
.py=Python.File
> ftype Python.File
Python.File="F:\Python32\python.exe" "%1" %*
Run Code Online (Sandbox Code Playgroud)

(这是我路径上最重要的'python.exe')

更新:这不是Python的事情.如果我创建filter.sh,使用cygwin bash运行会发生同样的事情.显式运行'echo hello | bash filter.sh'工作正常,但'echo hello | filter.sh'通过assoc和ftype机制使用bash执行filter.sh,失败了'/ dev/stdin:没有这样的文件或目录'.

所以我必须将这个显式的'python'添加到我的所有命令行中?另外,我很好奇为什么它会破裂.这只是我机器的一些特点,还是其他人也看到了这个?

Dav*_*son 1

echo你用什么?您的路径上是否有 UNIX 风格的echo实用程序,或者您只是使用 Microsoft 的实用程序(它无法实现您想要的功能)?echo on如果在命令提示符下键入会发生什么?

我在 Windows 7 中运行,无法重现此问题。我的路径上有一个 UNIX 风格的echo实用程序。我已经安装了 ruby​​ 1.9.2并在以下位置编写了小程序test.rb

while s = $stdin.gets
  print s
end
Run Code Online (Sandbox Code Playgroud)

当我键入以下任何命令时,程序就会运行:

  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
Run Code Online (Sandbox Code Playgroud)

我对 ftype 不太了解,但也许您应该在系统上安装 ruby​​,看看我的示例程序是否适合您。