Cython

时间:2018-01-22 17:39:52

标签: module cython importerror

我对cython很新,所以我有一个基本的问题。我试图将一个基类从一个cython文件导入另一个cython文件来定义派生类。我在名为cythonTest/的单个目录中包含以下代码:

afile.pxd
afile.pyx
bfile.pxd
bfile.pyx
__init__.py
setup.py

afile.pxd:

cdef class A:
    pass

afile.pyx:

cdef class A:
    def __init__(self):
        print("A__init__()")

bfile.pxd:

from afile cimport A

cdef class B(A):
    pass

bfile.pyx:

cdef class B(A):
    def __init__(self):
        print "B.__init__()"

setup.py:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize

extensions = [Extension("afile", ["afile.pyx"]), 
              Extension("bfile", ["bfile.pyx"])]

setup(ext_modules=cythonize(extensions))

此代码似乎正确编译。运行import afile工作正常,但运行import bfile会导致以下错误

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "bfile.pyx", line 1, in init cythonTest.bfile
    cdef class B(A):
ImportError: No module named cythonTest.afile

有人知道我做错了什么吗?我使用的是Python 2.7.6和Cython 0.27.3

2 个答案:

答案 0 :(得分:0)

您好像使用cythonTest作为包名(包含__init__.py的目录用作包)。

模块名称需要反映在扩展名中,以便导入才能正常工作:

extensions = [Extension("cythonTest.afile", ["cythonTest/afile.pyx"]), 
              Extension("cythonTest.bfile", ["cythonTest/bfile.pyx"])]

也可能需要在包目录下移动pyx文件--Cython在构建扩展时使用包名称。

答案 1 :(得分:0)

一种解决方案是使用显式导入。负面:您必须安装包才能使用。

我有以下结构:

.
├── cythonTest
│   ├── afile.pxd
│   ├── afile.pyx
│   ├── bfile.pxd
│   ├── bfile.pyx
│   └── __init__.py
└── setup.py

文件:

cythonTest / afile.pxd

cdef class A:
    pass

cythonTest / afile.pyx

cdef class A:
    def __init__(self):
        print("A__init__()")

cythonTest / bfile.pxd

cimport cythonTest.afile

cdef class B(cythonTest.afile.A):
    pass

cythonTest / bfile.pyx

cimport cythonTest.afile

cdef class B(cythonTest.afile.A):
    def __init__(self):
        print "B.__init__()"

init文件为空,它仅用于将目录定义为模块。

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize

extensions = [Extension("cythonTest.afile", ["cythonTest/afile.pyx"]), 
              Extension("cythonTest.bfile", ["cythonTest/bfile.pyx"])]

setup(
    packages=['cythonTest'],
    ext_modules=cythonize(extensions),
)