Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows上的Python管道:为什么不起作用?_Python_Windows_Piping - Fatal编程技术网

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

Windows上的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机器上测试了它,如果您指定

我正在尝试这样的事情

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机器上测试了它,如果您指定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重定向,您可以将此值添加到注册表(在“我的盒子”上进行测试并验证此值是否按预期工作)

  • 启动注册表编辑器
  • 在注册表中找到并单击以下项:

    HKEY\U LOCAL\U机器\软件\ Microsoft\Windows\CurrentVersion\Policys\Explorer

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

    值名称:InheritConsoleHandles
    数据类型: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