Mac版Python的curses模块不支持UTF-8?

-1 投票
2 回答
776 浏览
提问于 2025-04-16 00:30

我正在尝试在我的curses应用程序中显示很多unicode文本。我的开发机器是MacOSx 10.6,使用的是苹果自带的默认Python。

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

当我把unicode文本添加到屏幕上时,屏幕就乱了。我试着在网上找解决办法,其他人建议我把_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

我该如何检查我的curses模块链接了哪个库?我又该如何链接到其他库呢?有没有办法不重新编译我的Python就能做到这一点?


这有点尴尬,但我找到了在我的环境中正确打印unicode的方法。我想我之前在某个时候安装过Macports的curses库,但忘记了。

第一次文本没有显示出来的问题是因为我需要在我的Python程序中设置区域设置。我原以为区域设置会从我运行的终端继承,但实际上只需要添加两行代码就解决了我的问题:

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

不过,了解Python外部库的位置以及如何检查它们还是很有用的。

2 个回答

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,或者可以使用 HomebrewMacPorts 或者 Fink 来帮助你。

编辑:

看起来现在的 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)
2

要查看一个 .so 文件使用了哪些其他的 .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)

这是我在 OSX 10.5 上安装的 Python 2.6.4 的情况——因为你在 10.6 上使用的是苹果自带的 Python,所以你的 _curses.so 的具体位置会有所不同,你只需执行

$ python
>>> import _curses
>>> _curses.__file__

来查看你感兴趣的 _curses.so 的确切位置,然后对它使用 otool -L

在系统自带的 Python 上替换一个 .so 文件似乎风险很大——你可能会弄坏某些东西,最后不得不重装操作系统等等。为什么不直接从 python.org 下载一个 Python 呢?

下载最新版本的 2.6 的 .dmg 文件和源代码(除非你很冒险,想试试 2.7 的候选版本;-),然后你可以安装这个 .dmg 文件(它会安装到 /usr/local不会覆盖系统自带的 Python;记得在你的 .bashrc 或其他地方设置好 PATH,让 /usr/local/bin/usr/bin 前面),然后,如果你的问题还存在,你可以根据自己的需求从源代码重新编译,并替换本地安装中的特定 _curses.so,完全不影响系统目录(我觉得这样做最稳妥...)。

撰写回答