如何解决setuptools安装含Cython子模块的Python包时文件缺失问题?
解决pytools包中Cython子模块nms安装后无法导入的问题
这种情况我碰到过不少,本质就是你的setup.py配置没跟上,导致编译好的nms.so没被自动纳入安装流程。给你几个针对性的解决办法,按顺序排查就行:
1. 确保Cython扩展模块的路径声明正确
这是最常见的原因——你得让setup.py知道要把编译后的.so文件生成到pytools/nms目录下,并且把它当成包的一部分。修改你的setup.py,加入以下配置:
from setuptools import setup, Extension from Cython.Build import cythonize import numpy as np # 如果你的nms用到了numpy,必须加这个 # 定义Cython扩展模块 extensions = [ Extension( name="pytools.nms.nms", # 关键!命名要对应包的层级结构 sources=["pytools/nms/nms.pyx"], # 你的Cython源文件路径 include_dirs=[np.get_include()], # 依赖numpy的话必须包含其头文件 extra_compile_args=["-O3"], # 可选:开启编译优化,提升运行速度 ) ] setup( name="pytools", version="0.1", packages=["pytools", "pytools.nms"], # 声明要安装的子包 ext_modules=cythonize(extensions), # 编译Cython扩展 )
这样编译时,nms.so会直接生成在pytools/nms目录下,安装过程中会被自动复制到/usr/local/lib/python2.7/dist-packages/pytools/nms/。
2. 配置包数据自动包含
如果你的扩展已经正确编译,但setup.py没把.so文件识别为包的一部分,可以通过package_data或MANIFEST.in来强制包含:
方法一:在setup.py中添加package_data
setup( ..., package_data={ "pytools.nms": ["nms.so"], # 指定nms子包需要包含的文件 }, include_package_data=True, )
方法二:创建MANIFEST.in文件
在项目根目录新建MANIFEST.in,内容如下:
include pytools/nms/nms.so
这个文件会告诉setuptools在打包时把指定文件包含进去。
3. 使用pip命令安装(更可靠)
你之前用的sudo python -H setup.py其实不是最优方式,pip会更规范地处理包的安装路径和文件复制。试试用以下命令安装:
sudo pip install .
如果是开发阶段,想修改代码后不用重新安装,可以用可编辑模式:
sudo pip install -e .
4. 检查包结构和__init__.py
确保你的包目录结构完整,每个子目录都有__init__.py:
pytools/ __init__.py nms/ __init__.py nms.pyx
并且在pytools/nms/__init__.py中添加导入语句,让外部能直接访问nms模块:
from .nms import *
这样你在IPython中执行from pytools import nms或者import pytools.nms时就能正常导入了。
内容的提问来源于stack exchange,提问作者Kai ZHAO
相关产品推荐
相关产品推荐

