我正在尝试构建和分发一个废弃的package。我创建了一个fork。在每台机器上用cibuildwheel构建它会使思考变得容易得多,但是它给我带来了很多问题。我成功地在py3{7,8,9,10}-manylinux_x86_64
的cibuildwheel中运行了构建过程(manulinux2014
,它有Glibc 2. 17),并且测试在所有编译的Python版本的Docker映像中都成功运行。它在我构建它的机器上也运行得很好,在Docker之外,这是Ubuntu 18.04 python 3.8。但是当我在另一台机器(Fedora 36 Python 3.10 GLibc 2.36)上安装它时,pyx扩展的一个已编译的二进制文件给了我这个错误:
Traceback:
/usr/lib64/python3.10/importlib/__init__.py:126: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
tests/test_glove.py:4: in <module>
from glove import Corpus, Glove
../venv-glove/lib64/python3.10/site-packages/glove/__init__.py:2: in <module>
from .glove import Glove
../venv-glove/lib64/python3.10/site-packages/glove/glove.py:16: in <module>
from .glove_cython import fit_vectors, transform_paragraph
E ImportError: /home/user/venv-glove/lib64/python3.10/site-packages/glove/glove_cython.cpython-310-x86_64-linux-gnu.so: undefined symbol: __pow_finite
在Fedora机器上,本地构建的python setup.py wheel
轮运行良好。
在搜索了here和here之后,我发现它与-ffast-math
选项有关。禁用它可以避免这个问题,但性能下降了很多。另外,添加-fno-builtin
也不能解决这个问题。
然后我问了cibuildwheel问题跟踪器here,他们帮助我在Cython生成的.c中定义了操作符(参见here)。在使用该操作符编译后,没有特定的-march
参数,我可以运行代码,但它以无限循环结束。无限期运行的函数是这个。
看起来我在2.31下用Glibc构建并在更高版本的系统中使用它面临着弃用问题。我想知道这里是否有人知道如何正确定义操作符,或者是否有可能在不删除-ffast-math
的情况下编译扩展。
我还尝试使用gdb -ex r --args $(pyenv which python) -m pytest .
调试失败的测试,但调试器无法捕获cython包:
ImportError while importing test module '/home/user/work/glove/glove-python/tests/test_corpus.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib/python3.10/importlib/__init__.py:126: in import_module
return _bootstrap._gcd_import(name[level:], package, level)
tests/test_corpus.py:9: in <module>
from glove import Corpus
glove/__init__.py:1: in <module>
from .corpus import Corpus
glove/corpus.py:10: in <module>
from .corpus_cython import construct_cooccurrence_matrix
E ModuleNotFoundError: No module named 'glove.corpus_cython'
1条答案
按热度按时间vsikbqxv1#
您是否尝试将您的库链接到libm?