Cython项目导入报错:无法找到pyfracdiff.fracdiff模块
问题根源
核心问题出在setup.py的Extension命名与模块结构不匹配:
- 你将Extension名称设为
"pyfracdiff",导致编译后生成的扩展模块文件pyfracdiff.cpython-xxx.so与包目录pyfracdiff同名。Python导入时会优先加载这个so文件而非包目录;同时你期望的pyfracdiff.fracdiff子模块根本不存在,因为编译产物没有生成在包内。
解决步骤
1. 修改setup.py的Extension配置
将Extension的名称从"pyfracdiff"改为"pyfracdiff.fracdiff",让编译后的扩展模块作为pyfracdiff包的子模块存在:
# setup.py from setuptools import setup, Extension from Cython.Build import cythonize import numpy as np # 修改Extension名称为"pyfracdiff.fracdiff" ext = Extension("pyfracdiff.fracdiff", sources=['fracdiff.pyx', 'src/fdcore.c'], include_dirs=['src/', np.get_include(), '/usr/share/R/include/'], define_macros=[('NPY_NO_DEPRECATED_API', 'NPY_1_7_API_VERSION')], headers=['src/*.h', '/usr/share/R/include/Rmath.h']) setup(ext_modules=cythonize(ext))
2. 清理旧编译产物
删除之前生成的编译文件,避免干扰:
rm -f pyfracdiff.cpython-*.so fracdiff.c rm -rf build/
3. 重新编译
在pyfracdiff目录下执行编译命令:
python setup.py build_ext --inplace
编译完成后,目录结构会更新为:
pyfracdiff ├── build | ├── lib.linux-x86_64-cpython-39 | | ├── pyfracdiff | | | ├── fracdiff.cpython-39-x86_64-linux-gnu.so ├── src | ├── fracdiff.h | ├── fdcore.c ├── __init__.py ├── fracdiff.c ├── fracdiff.pxd ├── fracdiff.pyx ├── pyfracdiff | ├── fracdiff.cpython-39-x86_64-linux-gnu.so ├── main.py └── setup.py
编译生成的fracdiff.cpython-xxx.so会被放在pyfracdiff包目录内。
4. 验证导入
回到上级目录,执行导入命令即可正常工作:
from pyfracdiff.fracdiff import fracdf_py
额外说明
- 你的
__init__.py为空是完全允许的,Python只需要这个文件标记目录为包,不需要额外内容。 - 如果不想调整子模块结构,也可以直接使用
from pyfracdiff import fracdf_py导入(对应原Extension命名的情况),但这种方式会让包目录和模块文件同名,容易混淆,不推荐。
内容的提问来源于stack exchange,提问作者Zhang Coleman
相关产品推荐
相关产品推荐

