Cython cimport 找不到 .pxd 模块

问题描述 投票:0回答:1

假设包的结构如下:

Some_Package/ 
    some_package/
        __init__.py
        core/
            __init__.py
            definition.pxd
        helper/
            __init__.py
            helper.pxd
            helper.pyx
    setup.py

definition.pxd
哪里我有:

import numpy as np
cimport numpy as np
# ...
ctypedef np.int32_t INT_t

helper.pxd
我有:

cimport some_package.core.definition
from some_package.core.definition cimport INT_t
# ...

helper.pyx
我什么都没有
cimport
。我将
setup.py
配置为:

ext_modules=cythonize('./some_package/helper/helper.pyx', include_dirs=['.', './some_package/core'])

现在我的问题是

python setup.py build_ext --inplace
,我可以成功构建到
.so
,但是当我尝试
import some_package.helper.helper
时,我得到了
ImportError

ImportError: No module named "some_package.helper.helper"

我查看了

helper.cpp
并发现了一些像这样的行:

  __pyx_t_1 = __Pyx_ImportModule("some_package.core.definition"); if (!__pyx_t_1) __PYX_ERR(0, 1, __pyx_L1_error)

我想这可能与导入路径有关,但我无法发现问题所在。所有

__init__.py
都是空的,我已在每个文件中导入
absolute_import
。我也改了
include_dirs
,但还是不行。

编辑#1

根据文档

include_dirs
添加到
*.pxd
搜索路径。所以我也尝试将
cimport
中的
helper.pxd
语句更改为:

cimport definition
from definition cimport INT_t

这次,

cython
无法编译:
"definition.pxd" not found
。但是,它应该在搜索路径中。

编辑#2

一个快速练习是在

definition.pyx
中添加一个空的
core/
,然后将扩展配置为:

extensions = [
    Extension("some_package.core.definition", ["some_package/core/definition.pyx"])
    Extension("some_package.helper.helper", ["some_package/helper/helper.pyx"])
]

然后在

setup.py

ext_modules=cythonize(extensions)

现在

cimport some_package.core.definition
正在
helper.pxd
工作。

但是,这并不优雅。

python cython cythonize
1个回答
2
投票

我忽略了我有一些台词:

cdef INT_t some_int = 1

但是,在

.pxd
文件中,不能有任何可执行代码。在这种情况下,似乎
Cython
将其视为一个包,而不是像
.pyx
文件那样。

可能有两种解决方法:

  1. cdef extern
    来自
    C
    标题。

  2. 内联函数总结。

© www.soinside.com 2019 - 2024. All rights reserved.