Windows上的Python管道:为什么不起作用?
我正在尝试这样的事情 Output.pyWindows上的Python管道:为什么不起作用?,python,windows,piping,Python,Windows,Piping,我正在尝试这样的事情 Output.py print "Hello" Input.py greeting = raw_input("Give me the greeting. ") print "The greeting is:", greeting 在命令行 Output.py | Input.py 但它返回一个EOFError。有人能告诉我我做错了什么吗 谢谢你的帮助 编辑 Patrick Harrington可以工作,但我不知道为什么…我在我的Windows机器上测试了它,如果您指定
print "Hello"
Input.py
greeting = raw_input("Give me the greeting. ")
print "The greeting is:", greeting
在命令行
Output.py | Input.py
但它返回一个EOFError。有人能告诉我我做错了什么吗
谢谢你的帮助
编辑Patrick Harrington可以工作,但我不知道为什么…我在我的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中的一个bug,从文件关联启动stdin/stdout重定向时可能无法正常工作。因此,解决方法正如我和Patrick所指出的,您需要指定“python”将运行input.py,否则它将无法将stdout从output.py重定向到stdin for input.py
参考:
更新2:
若要更改此行为并使Windows管道按预期的方式用于stdin/stdout重定向,您可以将此值添加到注册表(在“我的盒子”上进行测试并验证此值是否按预期工作)
数据类型:REG_DWORD
基数:十进制
价值数据:1
Output.py | python Input.py
输出将是:
请代我问候。问候语是:你好
以下是获得EOFError的原因(来自原始输入文档): 然后,该函数从中读取一行 输入,将其转换为字符串 (删除尾随换行符),以及 返回那个。当读取EOF时, 提高了EOFError 您可能需要使用sys.stdin,它提供了一个文件对象,您可以从中使用read、readlines方法
import sys
for greeting_line in sys.stdin.readlines():
print "The greeting is:", greeting_line.strip()
也就是说,我使用了输入(..)而不是原始输入(..)我更新了我的答案,以解释为什么Patrick和我提出的解决方案有效,而原始方案无效。使用替代解决方案(添加注册表项)再次更新为了避免在调用input.py时指定python可执行文件,值得一提的是,现在您可以向Windows注册表添加
inheritageConsoleHandles
值,以使用链接的microsoft.com页面中描述的output.py | input.py
。