Windows上的Pythonpipe道:为什么这不起作用?

我正在尝试这样的事情

Output.py

print "Hello" 

Input.py

 greeting = raw_input("Give me the greeting. ") print "The greeting is:", greeting 

在CMD线

 Output.py | Input.py 

但是它返回一个EOFError 。 有人能告诉我我做错了什么吗?

谢谢你的帮助。

编辑
帕特里克哈灵顿的解决scheme的作品,但我不知道为什么…

我测试了这个在我的Windows机器上,它的工作原理如果你指定Python的exe文件:

 C:\>C:\Python25\python.exe output.py | C:\Python25\python.exe input.py Give me the greeting. The greeting is: hello 

但是,如果直接运行命令,我也会遇到EOFError:

 output.py | input.py 

我不确定这是为什么,我仍在研究这一个,但至少这应该为您提供一个解决方法。 这可能与文件处理程序调用.py文件的方式有关。

更新 :那么,你知道什么。 看起来像这实际上是Windows中的一个错误,从文件关联启动时,标准输入/标准输出重定向可能无法正常工作。 所以解决方法就像我自己和Patrick所说的那样,您需要指定“python”将运行input.py,否则它将不会正确地将output.py的stdout重定向到input.py的stdin。

参考

http://mail.python.org/pipermail/python-bugs-list/2004-August/024923.html

http://support.microsoft.com/default.aspx?kbid=321788

更新2

为了改变这种行为,使Windows管道按照标准/标准输出重定向的预期工作,你可以将这个值添加到注册表中(在我的盒子上进行测试,并按需要验证)。

  1. 启动注册表编辑器
  2. 找到并单击注册表中的以下项:

    HKEY_LOCAL_MACHINE \ SOFTWARE \微软\的Windows \ CurrentVersion \政策\ Explorer中

  3. 在编辑菜单上,单击添加值,然后添加以下注册表值:

    值名称: InheritConsoleHandles
    数据类型: REG_DWORD
    基数:小数
    价值数据:1

  4. 退出注册表编辑器。

将其更改为:

 Output.py | python Input.py 

输出将是:

给我打招呼 问候语是:你好

这就是为什么你得到EOFError(从raw_input的文档):

然后该函数从输入中读取一行,将其转换为一个字符串(剥离尾随的换行符),然后返回该行。 当读取EOF时,会引发EOFError。

http://docs.python.org/library/functions.html?highlight=raw_input#raw_input

你可能想要使用sys.stdin ,它提供了一个文件对象,你可以使用read,readlines方法。

 import sys for greeting_line in sys.stdin.readlines(): print "The greeting is:", greeting_line.strip()