我是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
发布于 2018-01-23 12:43:22
您似乎正在使用cythonTest
作为包名称(包含用作包的__init__.py
的目录)。
模块名称需要反映在扩展名中才能正常导入:
extensions = [Extension("cythonTest.afile", ["cythonTest/afile.pyx"]),
Extension("cythonTest.bfile", ["cythonTest/bfile.pyx"])]
可能还需要移动包目录下的pyx文件- Cython在构建扩展时使用包名。
发布于 2018-01-23 16:19:57
一种解决方案是使用显式导入。缺点:你必须安装这个包才能正常工作。
我有以下结构:
.
├── 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),
)
https://stackoverflow.com/questions/48387310
复制