使用curses支持编译Python

Cpt*_*rkt 5 python solaris ncurses python-curses

我尝试编译和安装带有 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'
Run Code Online (Sandbox Code Playgroud)

各种谷歌告诉我,这是因为在编译 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
Run Code Online (Sandbox Code Playgroud)

这似乎应该这样做。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
Run Code Online (Sandbox Code Playgroud)

我还尝试使用 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
Run Code Online (Sandbox Code Playgroud)

然后我尝试:

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
Run Code Online (Sandbox Code Playgroud)

在任何一种情况下,相同的情况:

ImportError: No module named '_curses'
Run Code Online (Sandbox Code Playgroud)

编辑更新

我刚刚意识到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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

Cpt*_*rkt 2

当我最初发布时,我没有用“--with-shared”编译ncurses。我使用该选项重新编译了 ncurses,之后,这有效了:

\n\n
export LDFLAGS=-L/usr/local/pkg/ncurses/5.9/lib\nexport CPPFLAGS="-I/usr/local/pkg/ncurses/5.9/include -I/usr/local/pkg/ncurses/5.9/include/ncurses"\n./configure --enable-shared --prefix=/usr/local/pkg/python/3.4.3\nmake\nmake install\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xc2\xaf\\_(\xe3\x83\x84)_/\xc2\xaf

\n