2010-06-28 106 views
0

我想在我的curses應用程序中顯示大量的unicode文本。我的開發機器是MacOSx 10.6,我使用Apple提供的默認Python。Mac版本的Python在curses模塊中不支持UTF-8?

Python 2.6.1 (r261:67515, Feb 11 2010, 00:51:29) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin 

當我向屏幕添加unicode文本時,屏幕全部搞砸了。我嘗試Google解決方案,其他人建議將_curses模塊與libncursesw庫而不是libncurse庫鏈接。

我檢查了我的路,我發現(見下文)在/ opt/local/lib目錄

libncurses++.a 
libncurses++w.a 
libncurses.5.dylib 
libncurses.a 
libncurses.dylib 
libncursesw.5.dylib 
libncursesw.a 
libncursesw.dylib 

如何檢查哪個庫我詛咒模塊相連,我怎麼能與其他庫鏈接?有沒有可能沒有重新編譯我的Python呢?


這是一種尷尬,但我想到了在我的環境中正確打印unicode的解決方案。我想在某些時候,我確實從Macports安裝了curses庫,並忘記了我已經擁有它了。

文本第一次沒有顯示的問題是因爲我需要在我的python程序中設置語言環境。我認爲,區域設置會從我運行shell繼承,而只是添加了兩行代碼固定我的問題:

import locale 
locale.setlocale(locale.LC_ALL,"") 

雖然,這是很好的知道蟒蛇外部庫的生活,以及如何進行檢查。

+0

我試圖將/ usr/lib中的libcurses.dylib與我在/ opt/local/lib中找到的libcurses.dylib鏈接在一起,但結果是一樣的......所以沒有運氣〜 – Patrick 2010-06-28 01:28:58

+0

令人驚訝的是,魔術兩行,python(Apple版本)和python2.6(Macport版本)均正確顯示unicode。 – Patrick 2010-06-28 02:11:02

回答

2

要檢查哪些其他.so SA .so用途,使用otool -L - 例如:

$ otool -L /Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-dynload/_curses.so 
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-dynload/_curses.so: 
    /Library/Frameworks/Python.framework/Versions/2.6/lib/libncurses.5.dylib (compatibility version 5.0.0, current version 5.0.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.3.10) 

這就是我對我的Python 2.6.4安裝在OSX 10.5 - 因爲你使用蘋果自己的Python在10.6,您_curses.so的確切位置會有所不同,只是做

​​

看到的感興趣的_curses.so究竟在何處,然後調用otool -L上它。

在安裝了系統的Python上替換.so對我來說似乎充滿了危險 - 您可能會破壞某些東西並最終不得不重新安裝操作系統等。爲什麼不從python.org安裝Python下載?

同時獲得.dmg和源最近的2.6版本(除非你是如此喜歡冒險的你想嘗試一個候選版本2.7 ;-),那麼你可以安裝.dmg(它會去/usr/local而不是覆蓋系統Python;在你的.bashrc/usr/local/bin在你的PATH中之前的地方適當地設置你的PATH,然後,如果你的問題依然存在,你可以用源代碼重建你想要的任何選項, _curses.so在本地安裝,根本不打擾系統目錄(對我來說似乎最謹慎......)。

+0

不幸的是,python.org安裝程序通常鏈接到它自己的libncurses副本,而不是libncuresw。 – 2010-06-28 01:49:55

+0

@Ned,是的,這就是爲什麼重建(至少'_curses.so',但我可能會發現它更容易構建整個事情,然後移動該模塊)。 – 2010-06-28 02:19:20

1

蘋果提供的Python 2.6中附帶OS X 10.6所在的位置:

$ cd /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-dynload 
$ otool -L _curses* 
_curses.so: 
    /usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.0.1) 
_curses_panel.so: 
    /usr/lib/libpanel.5.4.dylib (compatibility version 5.4.0, current version 5.4.0) 
    /usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.0.1) 

這將是一個非常糟糕的主意,試圖在/System/Library修改任何因爲這可能打破OS X和/或擦拭通過系統更新。如果您需要重新鏈接,請從頭開始構建自己的Python,或者從Homebrew,MacPortsFink開始。

編輯:

看來,當前MacPorts的Python 2.6安裝使用libncursesw所以在安裝它可能是最簡單的解決方案:

$ cd /opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-dynload/ 
$ otool -L _curses* 
_curses.so: 
    /opt/local/lib/libncursesw.5.dylib (compatibility version 5.0.0, current version 5.0.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0) 
_curses_panel.so: 
    /opt/local/lib/libpanelw.5.dylib (compatibility version 5.0.0, current version 5.0.0) 
    /opt/local/lib/libncursesw.5.dylib (compatibility version 5.0.0, current version 5.0.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)