11

我正在尝试这样的事情

输出.py

print "Hello"

输入.py

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

在 cmd 行

Output.py | Input.py

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

谢谢你的帮助。

编辑
帕特里克哈灵顿解决方案有效,但我不知道为什么......

4

3 回答 3

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 重定向可能无法正常工作。所以解决方法正如我和帕特里克所指出的那样,您需要指定“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. 在注册表中找到并单击以下项:

    HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer

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

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

  4. 退出注册表编辑器。

于 2009-01-21T20:30:27.183 回答
4

将其更改为:

Output.py | python Input.py

输出将是:

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

于 2009-01-21T20:30:46.560 回答
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()
于 2009-01-22T01:22:47.173 回答