使用Cython打包多个.pyx文件为单个Python包时遇文件查找失败问题
Cython include文件找不到的问题:原因与解决方法
问题原因
当Cython编译mypkg/main.pyx时,默认工作目录是项目根目录,而非mypkg子目录。你在main.pyx中使用include "add.pyx"时,Cython会在根目录下查找该文件,但实际add.pyx和prod.pyx都在mypkg子目录里,因此出现找不到文件的错误。
解决方法
两种可靠方案任选其一即可:
方案1:在Extension配置中添加include搜索目录
修改setup.py中的Extension定义,添加include_dirs参数,指定mypkg为Cython的搜索目录:
from Cython.Distutils.build_ext import new_build_ext from setuptools import setup from setuptools.extension import Extension ext_modules = [ Extension( "mypkg.main", sources=["mypkg/main.pyx"], include_dirs=["mypkg"], # 新增:将mypkg加入搜索路径 ), ] setup( ext_modules=ext_modules, cmdclass={"build_ext": new_build_ext}, requires=['cython'], )
此修改后,Cython编译时会自动去mypkg目录查找目标文件,原main.pyx中的include语句无需改动。
方案2:修改include语句的路径
直接在mypkg/main.pyx中使用相对于项目根目录的完整路径:
include "mypkg/add.pyx" include "mypkg/prod.pyx"
这种方式无需修改setup.py,Cython会直接从根目录定位到目标文件。
验证构建与使用
修改完成后,按以下步骤验证:
- 清理残留构建文件(可选):删除
build、dist和mypkg.egg-info目录 - 构建包:
python -m build - 安装包:
pip install dist/mypkg-0.1.0.tar.gz(或对应wheel文件) - 测试功能:
import mypkg.main print(mypkg.main.add(1.0, 2.0)) # 输出3.0 print(mypkg.main.prod(2.0, 3.0)) # 输出6.0
内容的提问来源于stack exchange,提问作者ysroh260
相关产品推荐
相关产品推荐

