Cython编译pyx/pxd文件时类导入路径问题及解决
解决Cython跨文件导入自定义类的编译与运行问题
问题梳理
先明确下你的场景:
- 项目目录结构(从你运行
setup.py的../根目录来看):../ ├─ src/ │ └─ cython/ │ ├─ class1.pyx │ ├─ class1.pxd │ └─ class2.pyx └─ setup.py - 你想在
class2.pyx中导入class1里定义的Class1类,但两种导入方式都出问题:- 用
from src.cython.class1 cimport Class1时,编译直接失败; - 改用
from class1 cimport Class1能编译过,但运行时抛出No module named 'src.cython.class1'的错误。
- 用
核心原因
正如你发现的,这个问题的根源就是**src/cython/目录下缺少__init__.py文件**。不管是Python还是Cython,都需要通过__init__.py来识别一个目录为合法的包——哪怕这个文件是空的,只要存在,就能让目录被当作包结构的一部分处理。
具体解决步骤
1. 补充__init__.py文件
在../src/cython/目录下创建一个空的__init__.py,让你的目录结构变成:
../ ├─ src/ │ └─ cython/ │ ├─ __init__.py │ ├─ class1.pyx │ ├─ class1.pxd │ └─ class2.pyx └─ setup.py
2. 修正导入语句
在class2.pyx里使用完整的包路径导入:
from src.cython.class1 cimport Class1
3. 重新编译运行
回到../根目录,重新执行你的setup.py编译脚本,这次编译和运行都应该能正常工作了。
为什么之前的两种导入方式会出问题?
- 第一种导入失败:因为
src/cython没有__init__.py,不被识别为合法的Python包,Cython无法解析完整的包路径,所以编译阶段就找不到目标类。 - 第二种导入编译过但运行报错:编译时Cython是在当前目录(
src/cython)下直接找到class1的文件,所以能通过编译;但运行时Python会按照包结构去查找src.cython.class1模块,由于cython目录不是合法包,导致模块查找失败。
内容的提问来源于stack exchange,提问作者joaoavf
相关产品推荐
相关产品推荐

