使用 curses 支持编译 Python

Compiling Python with curses support

我尝试编译和安装支持 curses 的 Python 失败了,我尝试了各种迭代我的编译标志和诸如此类的东西,但似乎无法让这个东西工作。

这是在 Solaris 11 上,Python 版本 3.4.3:

首先,问题来了:

Python 3.4.3 (default, Mar  3 2015, 14:43:41) 
[GCC 4.5.2] on sunos5
Type "help", "copyright", "credits" or "license" for more information.
>>> import curses
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/pkg/python/3.4.3/lib/python3.4/curses/__init__.py", line 13, in <module>
    from _curses import *
ImportError: No module named '_curses'

各种Googlez告诉我这是因为编译Python时没有找到ncurses库。

所以我将 curses 从 ftp://ftp.gnu.org/gnu/ncurses/ (5.9) 安装到 /usr/local/pkg/ncurses/5.9 并尝试重新编译 Python,传入 ncurses 的位置:

export LDFLAGS=-L/usr/local/pkg/ncurses/5.9/lib
export CPPFLAGS="-I/usr/local/pkg/ncurses/5.9/include -I/usr/local/pkg/ncurses/5.9/include/ncurses"
./configure --enable-shared --prefix=/usr/local/pkg/python/3.4.3
make
make install

这似乎是应该的。 config.log 似乎没有表示任何失败。

checking curses.h usability... yes
checking curses.h presence... yes
checking for curses.h... yes
checking ncurses.h usability... yes
checking ncurses.h presence... yes
checking for ncurses.h... yes

我还尝试使用 Solaris 打包工具 OpenCSW 安装这些包:

libncurses5          CSWlibncurses5       5.9,REV=2011.11.21         298.2 KB
libncurses_dev       CSWlibncurses-dev    5.9,REV=2011.11.21         258.4 KB
libncursesw5         CSWlibncursesw5      5.9,REV=2011.11.21         341.5 KB
mutt_ncurses         CSWmutt-ncurses      1.5.23,REV=2014.03.14      484.4 KB
ncurses              CSWncurses           5.9,REV=2011.11.21         123.1 KB

然后我尝试了:

export LDFLAGS=-L/opt/csw/lib
export CPPFLAGS="-I/opt/csw/include -I/opt/csw/include/ncursesw"
./configure --enable-shared --prefix=/usr/local/pkg/python/3.4.3
make
make install

无论哪种情况,情况相同:

ImportError: No module named '_curses'

编辑更新:

我刚刚意识到 curses 模块是在 "make install" 期间构建的,而不是 "make",所以我遗漏了一些严重错误。特别是在使用 /usr/local/pkg 安装 ncurses 时:

building '_curses' extension
gcc -fPIC -Wno-unused-result -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -Werror=declaration-after-statement -I./Include -I. -IInclude -I/usr/local/pkg/ncurses/5.9/include -I/usr/local/pkg/ncurses/5.9/include/ncurses -I/usr/local/include -I/tmp/Python-3.4.3/Include -I/tmp/Python-3.4.3 -c /tmp/Python-3.4.3/Modules/_cursesmodule.c -o build/temp.solaris-2.11-i86pc.32bit-3.4/tmp/Python-3.4.3/Modules/_cursesmodule.o
gcc -shared -L/usr/local/pkg/ncurses/5.9/lib -L/usr/local/pkg/ncurses/5.9/lib -L/usr/local/pkg/ncurses/5.9/lib -I/usr/local/pkg/ncurses/5.9/include -I/usr/local/pkg/ncurses/5.9/include/ncurses build/temp.solaris-2.11-i86pc.32bit-3.4/tmp/Python-3.4.3/Modules/_cursesmodule.o -L. -L/usr/local/pkg/python/3.4.3/lib -L/usr/local/pkg/ncurses/5.9/lib -L/usr/local/lib -lncurses -lpython3.4m -o build/lib.solaris-2.11-i86pc.32bit-3.4/_curses.so
Text relocation remains                         referenced
    against symbol                  offset      in file
.rodata (section)                   0x50        /usr/local/pkg/ncurses/5.9/lib/libncurses.a(lib_color.o)
... (followed by hundreds more lines like the above)
ld: fatal: relocations remain against allocatable but non-writable sections
collect2: ld returned 1 exit status

Failed to build these modules:
_curses               _curses_panel         readline

特别是在使用 ncurses 的 OpenCSW 安装时:

building '_curses' extension
gcc -fPIC -Wno-unused-result -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -Werror=declaration-after-statement -DHAVE_NCURSESW=1 -I/usr/include/ncursesw -I./Include -I. -IInclude -I/opt/csw/include -I/opt/csw/include/ncursesw -I/usr/local/include -I/tmp/Python-3.4.3/Include -I/tmp/Python-3.4.3 -c /tmp/Python-3.4.3/Modules/_cursesmodule.c -o build/temp.solaris-2.11-i86pc.32bit-3.4/tmp/Python-3.4.3/Modules/_cursesmodule.o
/tmp/Python-3.4.3/Modules/_cursesmodule.c:281:29: error: expected declaration specifiers or ‘...’ before ‘cchar_t’
/tmp/Python-3.4.3/Modules/_cursesmodule.c: In function ‘PyCurses_ConvertToCchar_t’:
/tmp/Python-3.4.3/Modules/_cursesmodule.c:299:16: error: ‘wch’ undeclared (first use in this function)
/tmp/Python-3.4.3/Modules/_cursesmodule.c:299:16: note: each undeclared identifier is reported only once for each function it appears in
/tmp/Python-3.4.3/Modules/_cursesmodule.c: In function ‘curses_window_addch_impl’:
(...and many more messages like this)

Failed to build these modules:
_curses               _curses_panel         readline

看来你热衷于重新发明轮子。我建议您查看 NetBSD 的 PKGSRC,它与 Solaris 兼容并且现在工作得很好......即使使用 SUN Studio 编译器也是如此。 SmartOS/Illumos 的二进制包可以在 Solaris 11 上开箱即用(如果你是 x86)。

请注意,这个打包的东西确实有一些补丁 + 在 autotools 配置之后打补丁 Makefile + 向 PATH 注入伪造的 gccldas 命令,这是改变 cmdline 的脚本真实编译器的参数。你真的想重新发明这一切吗?

当我最初发布时,我没有用“--with-shared”编译 ncurses。我用那个选项重新编译了 ncurses,然后,这成功了:

export LDFLAGS=-L/usr/local/pkg/ncurses/5.9/lib
export CPPFLAGS="-I/usr/local/pkg/ncurses/5.9/include -I/usr/local/pkg/ncurses/5.9/include/ncurses"
./configure --enable-shared --prefix=/usr/local/pkg/python/3.4.3
make
make install

¯\_(ツ)_/¯