Cython导入同目录.pxd文件报错'signature.pxd not found'如何解决?
核心问题
你出现signature.pxd not found报错的原因有两个:
- Cython编译阶段未将
signature.pxd所在的目录加入头文件搜索路径,无法定位到声明文件 - 当前
setup.py仅指定了rk4.pyx、euler.pyx作为编译目标,未将公共声明的关联文件纳入编译上下文,若signature.pxd包含实现逻辑,还会出现符号找不到的后续报错。
修复步骤
- 第一步:完善包结构,在根
package目录和integrate子目录下各新增一个空的__init__.py文件,将目录标记为Python可识别的包,最终结构如下:
package |- __init__.py |- integrate |- __init__.py |- signature.pxd |- signature.pyx # 新增,存放类的实现 |- rk4.pyx |- euler.pyx
- 第二步:遵循Cython声明与实现分离规范,拆分
signature的代码:signature.pxd仅保留类型、类、函数的声明:
import numpy as np cimport numpy as np ctypedef np.float64_t FLOAT cdef class ProblemOde: cpdef np.ndarray[FLOAT, ndim=1] evaluate(self, double t, np.ndarray[FLOAT, ndim=1] y)- 新增的
signature.pyx存放实现逻辑:
import numpy as np cimport numpy as np from signature cimport FLOAT, ProblemOde cpdef np.ndarray[FLOAT, ndim=1] ProblemOde.evaluate(self, double t, np.ndarray[FLOAT, ndim=1] y): return np.ndarray([]) - 第三步:修改
setup.py,添加搜索路径并更新编译目标列表:
# built-in/generic imports import os from distutils.core import setup # third-party imports from Cython.Build import cythonize import numpy as np __module_dir__ = os.path.abspath(os.path.dirname(__file__)) integrate_dir = os.path.join(__module_dir__, 'package', 'integrate') # 新增signature.pyx到编译列表 packages_eopack = [ os.path.join(integrate_dir, 'signature.pyx'), os.path.join(integrate_dir, 'rk4.pyx'), os.path.join(integrate_dir, 'euler.pyx') ] directives = {'language_level': '3', 'always_allow_keywords': True} setup( ext_modules=cythonize( packages_eopack, compiler_directives=directives, annotate=True, # 添加integrate目录到Cython头文件搜索路径 include_path=[integrate_dir, np.get_include()] ), include_dirs=[np.get_include()] )
- 第四步:保持
rk4.pyx、euler.pyx的导入语句不变即可正常编译:
cimport signature from signature cimport ProblemOde
如果仍出现导入报错,可以改用全路径导入:
cimport package.integrate.signature from package.integrate.signature cimport ProblemOde
内容的提问来源于stack exchange,提问作者mauro
相关产品推荐
相关产品推荐

