2012-11-27 63 views
30

安裝新的Windows系統中,我已經安裝了Cygwin,並在其默認位置64 位的Python(2.7.3)(c:\cygwinc:\Python27\python),並增加了兩個Cygwin的紙槽和 Python目錄到我的路徑(在用戶變量PATH中)。從 正常的命令窗口,Python啓動完美,但是當我在CygWin環境中從bash調用它時,它掛起, 從不給我輸入提示。調用Windows上的Python掛起

我在一個decidely非標準位置與 舊版本的Python(32位)和Cygwin,巨蟒 ,並用此做其他機器上,以前,但始終。有沒有其他人有這個 問題,或有人可以告訴我它可能是什麼原因?

回答

28

問題是,由於Cygwin終端(MinTTY)的行爲方式,Python的本機Windows版本沒有意識到stdout是終端設備 - 它認爲它是一個管道,所以它運行在非交互模式而不是交互模式,並且它完全緩衝其輸出而不是線緩衝它。

這是新的原因可能是因爲在以前的Cygwin安裝中,您沒有MinTTY,而使用的終端只是標準的Windows終端。

爲了解決這個問題,您需要從常規的Windows終端(Cmd.exe)運行Python,或者安裝Cygwin版本的Python而不是Python的本機Windows版本。 Cygwin版本(可通過Cygwin的setup.exe安裝)可理解Cygwin終端,並在通過MinTTY運行時適當運行。

如果您想要的特定版本的Python不能作爲Cygwin包提供,那麼您還可以下載Python的源代碼並在Cygwin下自行構建它。如果您還沒有一個(GCC),那麼您需要一個Cygwin編譯器工具鏈,但是我相信它應該使用標準的./configure && make && make install命令進行編譯。

+1

+1 - 從Windows Python27切換到Cygwin Python32解決了我的問題。 – mouviciel

+2

謝謝。我無法改變Python的版本(沒有安裝2個版本,一個用於CygWin,一個用於其他所有版本),因爲它是我們生產構建鏈的一部分。但'python -i'工作,並且在'.bashrc'中創建一個別名可能是一個可以接受的解決方案。 –

+4

[This answer](http://stackoverflow.com/a/9549255/9530)也提供了一些我以前不知道的建議 - 使用'-u'命令行開關運行Python或設置環境變量' PYTHONUNBUFFERED = 1'會改變Python的緩衝行爲。 –

40

試試這個

python -i 

是的,你會在這裏和那裏發現一些小問題!

10

我有一個與Mercurial(hg)+ OpenSSH,Python和MinTTY類似的問題,但在MSYS下而不是CygWin。儘管如此,據我所知,這和我的問題都是由於MinTTY無法處理使用本地Windows控制檯功能的應用程序(在Adam的答案中,他詳細解釋了Python)。

對於我來說,我也跟着在https://code.google.com/p/mintty/issues/detail?id=56#c64

評論64編譯和我的路徑winpty(https://github.com/rprichard/winpty)項目找到了解決辦法,我是能夠運行本地的Python(交互模式)和Mercurial從MinTTY外殼沒有特殊的構建或開關(如python -i)。我需要的只是在pythonhg命令之前附加console.execonsole。爲了方便起見,我添加了別名,如alias hg="console.exe hg",這樣我就可以使用相同的命令,無論我在Linux shell還是Windows MinTTY bash shell中。

此外,此解決方案似乎可用於超越python和hg以外的更多原生應用程序。例如,運行mysql(有或沒有-p)會給出相同的問題(例如,「掛起」,沒有輸入提示)。追加console到它允許它照常。

+2

我*最終得到了50個聲望點來說謝謝!儘管'-i'在大多數情況下都能正常工作,但我們有一些主要運行cygwin的實驗室軟件,但是由於它需要ctypes.WinDLL,因此會調用windows python。這個勝利的電話有一個嵌入式的ipython提示符,並且在mintty(標籤/箭頭不起作用,都是愚蠢的)上被嚴重搞砸了。這是最簡單和最好的解決方案 - 像魅力一樣工作。在bash腳本中,只是做了「console.exe C:\ Python27 \ python.exe」,現在嵌入ipython非常棒!拔出頭髮,導致在64位窗口,薄荷只是在城鎮終端遊戲。 –

1

對於Cygwin中管理不同版本的Python的非cygwin的位置:

$ /usr/sbin/alternatives.exe 

使用--install這裏--config選項,它的工作原理一樣update-alternatives在Linux系統上。 我與python -i一起使用這個方法,它運行良好。

我還必須首先刪除/usr/bin中的sym-link文件,因爲它們是用CygWin的python安裝的,而不是最初通過alternatives.exe管理的。

0

我的解決方案涉及編寫一個shell腳本來運行python應用程序。

python file.py "[email protected]" | tee /dev/null 

額外的tee命令(無處)似乎解決了這個問題。

-1

重新安裝mintty使用Cygwin設置調用它。之後不必使用python -i。