【问题标题】:Error compiling Cython file: pxd not found in package编译 Cython 文件时出错:在包中找不到 pxd
【发布时间】:2020-01-21 10:58:55
【问题描述】:

尝试从其他包中导入 pxd 定义。

简单示例,a.pxd 文件:

cdef inline void a():
    print "a"

b.pyx 文件:

cimport a

def b():
    a.a()

到这里为止,一切正常,$ cython b.pyx 工作正常。

如果我将 a.pxd 移动到一个文件夹,例如 libs/,那么我将 b.pyx 更改为:

from libs cimport a

def b():
    a.a()

然后我有错误:

$ cython b.pyx 

Error compiling Cython file:
------------------------------------------------------------
...
from libs cimport a
^
------------------------------------------------------------

b.pyx:1:0: 'a.pxd' not found

Error compiling Cython file:
------------------------------------------------------------
...
from libs cimport a
^
------------------------------------------------------------

b.pyx:1:0: 'libs/a.pxd' not found

但是 libs/a.pxd 在那里。 从其他包导入 pxd 定义的正确方法是什么?

【问题讨论】:

    标签: cython


    【解决方案1】:

    A directory is not a package unless it contains a __init__.py file,即使文件为空。所以在libs目录下添加一个空的__init__.py文件。


    有了这个目录结构,你的a.pxd和b.pyx、setup.py和script.py(下),

    % tree .
    .
    ├── libs
    │   ├── a.pxd
    │   └── __init__.py
    ├── b.c
    ├── b.pyx
    ├── b.so
    ├── build
    │   ├── temp.linux-x86_64-2.7
    │   │   └── b.o
    │   └── temp.linux-x86_64-3.4
    │       └── b.o
    ├── script.py
    ├── setup.py
    

    运行script.py 工作:

    % python setup.py build_ext --inplace
    % python ./script.py 
    a
    

    setup.py:

    # python setup.py build_ext --inplace
    
    from distutils.core import setup
    from Cython.Build import cythonize
    
    setup(
        name='test',
        ext_modules=cythonize("b.pyx"),
    )
    

    脚本.py:

    import b
    b.b()
    

    【讨论】:

    • 当任何其他 cython 文件找不到任何 .pxd 文件时,这是您应该检查的第一件事。太好了!
    • 如果可以的话,我会再次投票,我又遇到了这个问题(facepalm)
    猜你喜欢
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    • 2018-02-05
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    • 2016-11-24
    相关资源
    最近更新 更多