本地开发Cython包:可编辑安装遇ModuleNotFoundError问题
解决Cython包开发模式下的模块找不到问题
问题原因
用pip install -e安装纯Python包时,Python直接从源码目录加载模块,但Cython的.pyx文件需要编译成共享库文件(.so/.pyd)才能被Python识别。默认编译流程会把产物放在build目录,而开发模式下Python不会从build目录加载模块,导致出现ModuleNotFoundError。
解决步骤
1. 确保setup.py配置正确
你的setup.py必须正确声明Cython扩展模块,示例如下:
from setuptools import setup, find_packages from Cython.Build import cythonize setup( name="my_package", packages=find_packages(), ext_modules=cythonize( # 指定你的Cython文件路径 "my_package/sub/cython_code.pyx", # 指定Python版本,匹配你的开发环境 compiler_directives={"language_level": "3"} ) )
如果你的Cython代码依赖numpy,需要添加include_dirs参数:
import numpy as np # ... 在setup函数中添加 include_dirs=[np.get_include()]
2. 编译并安装开发版包
在包含setup.py的根目录(即外层my_package/)执行以下命令:
# 先清理旧的编译产物(可选但推荐) rm -rf build/ my_package/sub/*.c my_package/sub/*.so # 编译Cython模块并安装开发版 pip install -e .
这个命令会自动编译.pyx文件,并将编译后的共享库文件复制到my_package/sub/目录下,这样Python就能通过相对导入找到模块。
3. 修改Cython代码后的更新
每次修改cython_code.pyx后,需要重新编译安装:
pip install -e .
或者单独执行编译命令:
python setup.py build_ext --inplace
--inplace参数会直接将编译产物生成到源码目录,无需重新执行pip install -e。
验证
安装完成后,在虚拟环境中运行你的Python代码,from .cython_code import cython_function应该可以正常导入,不会再出现模块找不到的错误。
内容的提问来源于stack exchange,提问作者L.A.
相关产品推荐
相关产品推荐

