2010-06-28 108 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)