5

我尝试编译和安装带有 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 库。

所以我从ftp://ftp.gnu.org/gnu/ncurses/ (5.9) 到 /usr/local/pkg/ncurses/5.9 安装了 curses 并尝试重新编译 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”期间构建的,所以我错过了一些严重错误。特别是在使用 ncurses 的 /usr/local/pkg 安装时:

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
4

2 回答 2

2

当我最初发布时,我没有用“--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

¯\_(ツ)_/¯

于 2015-03-06T17:55:20.697 回答
0

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

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

于 2015-03-06T13:29:36.963 回答