2009-01-21 42 views
11

我想是這樣的Windows上的Python管道:爲什麼這不起作用?

Output.py

print "Hello" 

Input.py

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

在CMD線

Output.py | Input.py 

但它返回一個的EOFError。有人能告訴我我做錯了什麼嗎?

感謝您的幫助。

編輯
帕特里克·哈靈頓solution的作品,但我不知道爲什麼......

+0

這適用於Python 3.0。 – 2009-01-21 20:30:37

+0

也就是說,我使用輸入(..)而不是raw_input(..) – 2009-01-21 20:31:38

+0

我已經更新了我的答案,以解釋Patrick和我提出的解決方案爲什麼會起作用,原來不是。 – Jay 2009-01-21 20:38:41

回答

23

我測試這是我的Windows計算機上,如果指定了Python執行它的工作原理:

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文件調用文件處理程序的方式有關。

UPDATE:嗯,你怎麼知道的。看起來這實際上是Windows中的一個錯誤,當從文件關聯啓動時,stdin/stdout重定向可能無法正常工作。因此,解決方法是由我和帕特里克指出,你需要指定「蟒蛇」將運行input.py,否則將無法正確地從output.py stdout重定向到標準輸入input.py。

參考

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 \政策\探險

  3. 在編輯菜單,單擊添加值,然後添加以下 註冊表值:

    值名稱:InheritConsoleHandles
    數據類型:RE G_DWORD
    基數:十進制
    值數據:1

  4. 退出註冊表編輯器。

4

將其更改爲:

Output.py | python Input.py 

輸出將是:

給我打招呼。問候語是:你好

0

這就是爲什麼你得到的EOFError(從的raw_input的文檔):

然後函數讀取 輸入線,將其轉換爲字符串 (剝尾隨換行符),並返回 。當讀取EOF時,引發EOFError 。

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

您可能需要使用sys.stdin,因爲它提供了你可以使用讀取一個文件對象,readlines方法的方法。

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