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

时间:2009-01-21 20:20:06

标签: python windows piping

我正在尝试这样的事情

Output.py

print "Hello"

Input.py

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

在cmd行

Output.py | Input.py

但它返回 EOFError 。有人能告诉我我做错了吗?

感谢您的帮助。

编辑
Patrick Harrington solution有效,但我不知道为什么......

3 个答案:

答案 0 :(得分:23)

我在我的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中的一个错误,当从文件关联启动时,stdin / stdout重定向可能无法正常工作。所以解决方法是我自己和Patrick所指出的,你需要指定“python”将运行input.py,否则它将不会将stdout从output.py重定向到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管道按预期的方式运行stdin / stdout重定向,您可以将此值添加到注册表(在我的框中测试并验证其工作原理)。

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

         

    HKEY_LOCAL_MACHINE \ SOFTWARE \微软\的Windows \ CurrentVersion \政策\探险

  4.   
  5. 在“编辑”菜单上,单击“添加值”,然后添加以下内容   注册表值:

         

    值名称: InheritConsoleHandles
        数据类型: REG_DWORD
        基数:十进制
        价值数据:1

  6.   
  7. 退出注册表编辑器。

  8.   

答案 1 :(得分:4)

将其更改为:

Output.py | python Input.py

输出将是:

  

给我问候。问候语是:你好

答案 2 :(得分:0)

这就是你获得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()