首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Cython中的ImportError

Cython中的ImportError
EN

Stack Overflow用户
提问于 2018-01-23 01:39:52
回答 2查看 1.3K关注 0票数 0

我是cython的新手,所以我有一个基本的问题。我正在尝试将一个基类从一个cython文件导入到另一个cython文件中,以定义派生类。我在一个名为cythonTest/的目录中有以下代码

代码语言:javascript
代码运行次数:0
运行
复制
afile.pxd
afile.pyx
bfile.pxd
bfile.pyx
__init__.py
setup.py

afile.pxd:

代码语言:javascript
代码运行次数:0
运行
复制
cdef class A:
    pass

afile.pyx:

代码语言:javascript
代码运行次数:0
运行
复制
cdef class A:
    def __init__(self):
        print("A__init__()")

bfile.pxd:

代码语言:javascript
代码运行次数:0
运行
复制
from afile cimport A

cdef class B(A):
    pass

bfile.pyx:

代码语言:javascript
代码运行次数:0
运行
复制
cdef class B(A):
    def __init__(self):
        print "B.__init__()"

setup.py:

代码语言:javascript
代码运行次数:0
运行
复制
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会导致以下错误

代码语言:javascript
代码运行次数:0
运行
复制
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

EN

回答 2

Stack Overflow用户

发布于 2018-01-23 20:43:22

您似乎正在使用cythonTest作为包名称(包含用作包的__init__.py的目录)。

模块名称需要反映在扩展名中才能正常导入:

代码语言:javascript
代码运行次数:0
运行
复制
extensions = [Extension("cythonTest.afile", ["cythonTest/afile.pyx"]), 
              Extension("cythonTest.bfile", ["cythonTest/bfile.pyx"])]

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

票数 0
EN

Stack Overflow用户

发布于 2018-01-24 00:19:57

一种解决方案是使用显式导入。缺点:你必须安装这个包才能正常工作。

我有以下结构:

代码语言:javascript
代码运行次数:0
运行
复制
.
├── cythonTest
│   ├── afile.pxd
│   ├── afile.pyx
│   ├── bfile.pxd
│   ├── bfile.pyx
│   └── __init__.py
└── setup.py

文件:

cythonTest/afile.pxd

代码语言:javascript
代码运行次数:0
运行
复制
cdef class A:
    pass

cythonTest/afile.pyx

代码语言:javascript
代码运行次数:0
运行
复制
cdef class A:
    def __init__(self):
        print("A__init__()")

cythonTest/bfile.pxd

代码语言:javascript
代码运行次数:0
运行
复制
cimport cythonTest.afile

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

cythonTest/bfile.pyx

代码语言:javascript
代码运行次数:0
运行
复制
cimport cythonTest.afile

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

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

代码语言:javascript
代码运行次数:0
运行
复制
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),
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48387310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档