Cython cimport 找不到 .pxd 模块

Posted

技术标签:

【中文标题】Cython cimport 找不到 .pxd 模块【英文标题】:Cython cimport cannot find .pxd module 【发布时间】:2018-02-05 11:16:59 【问题描述】:

已解决,请参阅编辑 #3

假设一个包的结构如下:

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

根据documentation,include_dirs添加到*.pxd搜索路径。所以我也尝试将helper.pxd中的cimport语句改成:

cimport definition
from definition cimport INT_t

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

编辑#2

快速锻炼是在core/ 中添加一个空的definition.pyx,然后将扩展配置为:

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.definitionhelper.pxd 工作。

然而,这并不优雅。

编辑 3

我终于发现我忽略了一些行,例如:

cdef INT_t some_int = 1

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

可能有两种解决方法:

    cdef extern 来自 C 标头。

    总结内联函数。

【问题讨论】:

等等,你给你的包裹打电话src?我建议先使用不同的名称,因为这只会导致命名冲突。 @MSeifert 谢谢! src 用于说明目的(因为我发现它很常见)。事实上,src 被命名为 some_package 并被放在名为 Some_Package 的根目录中。 是的,它是src 文件的目录。最后,您从那里获取代码,但将其构建为实际包中的扩展。如果概念发生了变化,那就有点令人困惑了。 :-] @MSeifert 好的,我已经修复了它们。谢谢。 :) 【参考方案1】:

我忽略了一些行:

cdef INT_t some_int = 1

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

可能有两种解决方法:

    cdef extern 来自 C 标头。

    总结内联函数。

【讨论】:

以上是关于Cython cimport 找不到 .pxd 模块的主要内容,如果未能解决你的问题,请参考以下文章

Cython 元类 .pxd:我应该如何实现 `__eq__()`?

.pyx 和 .pxd 文件在子目录中时的 Cython 0.23.4 AttributeError

cython 继承

Cython:啥类似于 C 包含守卫?

使用 Cython 编译时找不到库文件

Cython:致命错误:使用 numpy 找不到“numpy/arrayobject.h”文件