全新虚拟环境中安装pylbfgs失败,无法部署依赖它的dedupe求助
全新虚拟环境中安装pylbfgs失败,无法部署依赖它的dedupe求助
我太懂这种踩老库坑的难受了——pylbfgs最后一次更新还是2014年,完全跟不上近年Python和Cython的版本变化,哪怕你降级了Cython,Python 3.11的API变化也会导致类型不匹配的编译错误。咱们一步步来解决:
问题根源分析
从你贴的编译错误来看,核心是Cython对回调函数的类型检查变严格了(不管是Cython 3.0还是旧版Cython配合Python 3.11),而pylbfgs的.pyx代码还是十年前的写法,函数签名和现在要求的lbfgs_evaluate_t、lbfgs_progress_t类型不兼容。
可行解决办法
降级Python到3.10或更低版本
这是最省心的方案,毕竟pylbfgs的代码是针对旧Python生态写的。你可以这么操作:# 创建基于Python3.10的虚拟环境(确保你本地装了3.10) python3.10 -m venv dedupe-env source dedupe-env/bin/activate # Windows系统用 dedupe-env\Scripts\activate # 先装指定版本的Cython,再安装pylbfgs pip install Cython==0.29.35 pip install pylbfgs等pylbfgs装成功后,再安装dedupe就没问题了。
尝试用conda安装pylbfgs
Conda社区经常会给这类老库打补丁适配新环境,你可以试试:# 激活你的虚拟环境后执行 conda install -c conda-forge pylbfgs装完后再用pip安装dedupe即可。
手动修改pylbfgs源码编译(适合愿意折腾的情况)
如果不想降级Python,可以下载pylbfgs的源码修改后本地编译:- 从PyPI下载PyLBFGS-0.2.0.14.tar.gz并解压
- 打开
lbfgs/_lowlevel.pyx,找到报错的第395、396行 - 给回调函数加上强制类型转换:把
call_eval改成<lbfgs_evaluate_t>call_eval,call_progress改成<lbfgs_progress_t>call_progress - 进入解压后的目录,执行
pip install .完成本地安装
你遇到的完整错误信息
$ pip install pylbfgs Collecting pylbfgs Using cached PyLBFGS-0.2.0.14.tar.gz (98 kB) Installing build dependencies ... done Getting requirements to build wheel ... error error: subprocess-exited-with-error × Getting requirements to build wheel did not run successfully. │ exit code: 1 ╰─> [57 lines of output] /private/var/folders/jg/pb4kddl17kzf4njpdp3ht8rh0000gn/T/pip-build-env-rhor0rp4/overlay/lib/python3.11/site-packages/Cython/Compiler/Main.py:381: FutureWarning: Cython directive 'language_level' not set, using '3str' for now (Py3). This has changed from earlier releases! File: /private/var/folders/jg/pb4kddl17kzf4njpdp3ht8rh0000gn/T/pip-install-hgmjirii/pylbfgs_27ac07c00d1741aaa6fb205fbf713b21/lbfgs/_lowlevel.pyx tree = Parsing.p_module(s, pxd, full_module_name) Error compiling Cython file: ------------------------------------------------------------ ... x_a = aligned_copy(x0.ravel()) try: callback_data = (f, progress, x0.shape, args) r = lbfgs(n, x_a, fx_final, call_eval, ^ ------------------------------------------------------------ lbfgs/_lowlevel.pyx:395:40: Cannot assign type 'lbfgsfloatval_t (void *, lbfgsconst_p, lbfgsfloatval_t *, int, lbfgsfloatval_t) except? -1' to 'lbfgs_evaluate_t' Error compiling Cython file: ------------------------------------------------------------ ... x_a = aligned_copy(x0.ravel()) try: callback_data = (f, progress, x0.shape, args) r = lbfgs(n, x_a, fx_final, call_eval, call_progress, <void *>callback_data, &self.params) ^ ------------------------------------------------------------ lbfgs/_lowlevel.pyx:396:22: Cannot assign type 'int (void *, lbfgsconst_p, lbfgsconst_p, lbfgsfloatval_t, lbfgsfloatval_t, lbfgsfloatval_t, lbfgsfloatval_t, int, int, int) except? -1' to 'lbfgs_progress_t' Compiling lbfgs/_lowlevel.pyx because it changed. [1/1] Cythonizing lbfgs/_lowlevel.pyx Traceback (most recent call last): File "/Users/_/dev/test/env/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 353, in <module> main() File "/Users/_/dev/test/env/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 335, in main json_out['return_val'] = hook(**hook_input['kwargs']) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/_/dev/test/env/lib/python3.11/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 118, in get_requires_for_build_wheel return hook(config_settings) ^^^^^^^^^^^^^^^^^^^^^ File "/private/var/folders/jg/pb4kddl17kzf4njpdp3ht8rh0000gn/T/pip-build-env-rhor0rp4/overlay/lib/python3.11/site-packages/setuptools/build_meta.py", line 341, in get_requires_for_build_wheel return self._get_build_requires(config_settings, requirements=['wheel']) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/private/var/folders/jg/pb4kddl17kzf4njpdp3ht8rh0000gn/T/pip-build-env-rhor0rp4/overlay/lib/python3.11/site-packages/setuptools/build_meta.py", line 323, in _get_build_requires self.run_setup() File "/private/var/folders/jg/pb4kddl17kzf4njpdp3ht8rh0000gn/T/pip-build-env-rhor0rp4/overlay/lib/python3.11/site-packages/setuptools/build_meta.py", line 488, in run_setup self).run_setup(setup_script=setup_script) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/private/var/folders/jg/pb4kddl17kzf4njpdp3ht8rh0000gn/T/pip-build-env-rhor0rp4/overlay/lib/python3.11/site-packages/setuptools/build_meta.py", line 338, in run_setup exec(code, locals()) File "<string>", line 27, in <module> File "/private/var/folders/jg/pb4kddl17kzf4njpdp3ht8rh0000gn/T/pip-build-env-rhor0rp4/overlay/lib/python3.11/site-packages/Cython/Build/Dependencies.py", line 1134, in cythonize cythonize_one(*args) File "/private/var/folders/jg/pb4kddl17kzf4njpdp3ht8rh0000gn/T/pip-build-env-rhor0rp4/overlay/lib/python3.11/site-packages/Cython/Build/Dependencies.py", line 1301, in cythonize_one raise CompileError(None, pyx_file) Cython.Compiler.Errors.CompileError: lbfgs/_lowlevel.pyx [end of output] note: This error originates from a subprocess, and is likely not a problem with pip. error: subprocess-exited-with-error × Getting requirements to build wheel did not run successfully. │ exit code: 1 ╰─> See above for output. note: This error originates from a subprocess, and is likely not a problem with pip.
备注:内容来源于stack exchange,提问作者Mathias Bak
相关产品推荐
相关产品推荐

