You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cython编译pyx/pxd文件时类导入路径问题及解决

解决Cython跨文件导入自定义类的编译与运行问题

问题梳理

先明确下你的场景:

  • 项目目录结构(从你运行setup.py的../根目录来看):
    ../
    ├─ src/
    │  └─ cython/
    │     ├─ class1.pyx
    │     ├─ class1.pxd
    │     └─ class2.pyx
    └─ setup.py
    
  • 你想在class2.pyx中导入class1里定义的Class1类,但两种导入方式都出问题:
    1. 用from src.cython.class1 cimport Class1时,编译直接失败;
    2. 改用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:51:43