编译的cython+numpy中未定义 _PyUnicodeUCS4_IsWhitespace

2 投票
1 回答
2068 浏览
提问于 2025-04-17 00:02

我在使用Ubuntu 10.04,并用Cython把我的Python代码编译成二进制文件。然后我试着把两个二进制文件(一个是用NumPy的,另一个是不用的)复制到另一个支持的系统上。唯一不太好的做法是,我用了那个系统自带的Python(2.6),然后从我的Ubuntu上复制了NumPy的库。

当我运行那个不使用NumPy的程序时,它可以正常工作。但是当我运行那个带有'from numpy import ...'的程序时,就出现了一个错误,内容是:undefined symbol: _PyUnicodeUCS4_IsWhitespace。我以为是因为NumPy是为UCS4编译的,而新系统里的Python版本是UCS2。不过让我惊讶的是,当我直接用Python运行同样的代码并导入NumPy时,它是可以正常工作的。

所以我可以说,如果我打开'python'并导入NumPy库,它是可以正常使用的。但如果我用编译后的版本,就会出现UCS4的错误。你有什么想法吗?

(新系统我控制不了,不能随便在上面编译任何东西)

谢谢。

1 个回答

0

事情是这样的:
当你运行Python解释器并导入numpy库时,它会尝试从libpython.so中加载一个叫“Python”的符号(我猜是这样)。这就是为什么在解释器中可以正常工作的原因。所以对那个unicode函数的请求并不是来自numpy,而是来自Python本身——所以它使用的是编译时的UCS2函数(可能是这样)。
但是当你运行编译后的版本时,它又尝试加载那个函数——这时找不到,因为它在寻找UCS4版本。

我做了一个小检查:在libpython中用grep查找“_PyUnicode”,在第一个版本和第二个版本中,结果是不同的:一个打印出UCS4函数,另一个打印出UCS2函数。

所以我想这里的“简单”解决办法就是在我的第一个版本上编译一个UCS2版本的Python,然后设置Cython以UCS2进行编译……我相信这样就能解决问题。

撰写回答