有两个与导入有关的问题可能与cython有关,也可能没有?
我有以下简化文件来重新创建问题。所有文件都在同一目录中。 .pyx文件已成功汇编为*.so
,*.pyc
和*.c
个文件。
setup.py:
from distutils.core import setup
from Cython.Build import cythonize
setup(
ext_modules=cythonize("*.pyx"),
)
cy1.pyx:(cython)
cdef int timestwo(int x):
return x * 2
cy1.pxd:
cdef int timestwo(int x)
cy3.py :(普通蟒蛇)
def tripleit(x):
return x*3
go.py:
from cy1 import timestwo
print str(timestwo(5))
给我错误:ImportError:无法导入名称timestwo
如果我将其更改为:
go.py:
import pyximport; pyximport.install()
import cy1
print str(cy1.timestwo(5))
它告诉我:AttributeError:' module'对象没有属性' timestwo'
如果我一起取出cython并尝试使用来自cy3.py的正常python调用:
go.py:
import cy3
print str(cy3.tripeleit(3))
我得到:AttributeError:' module'对象没有属性' tripeleit'
如果我这样做,那就结束:
go.py:
from cy3 import tripleit
print str(tripeleit(3))
我明白了:
NameError: name 'tripeleit' is not defined
很抱歉,如果这是超级基本的,但我似乎无法弄明白。
答案 0 :(得分:5)
问题在于go.py
:
from cy1 import timestwo
print str(timestwo(5))
您正尝试导入定义为cdef
的函数。
要将此功能公开给Python,您必须使用def
或cpdef
。可能你必须保持cdef
为cimport
来自其他Cython文件,证明为什么你也有pxd
文件。在这种情况下,我通常有一个类似C
的函数和一个可以从Python调用的包装器。
在这种情况下,您的cy1.pyx
文件将如下所示:
cdef int ctimestwo(int x):
return x * 2
def timestwo(x): # <-- small wrapper to expose ctimestwo() to Python
return ctimestwo(x)
和您的cy1.pxd
文件:
cdef int ctimestwo(int x)
这样您就可以cimport
仅ctimestwo
功能。
答案 1 :(得分:1)
关于你的第二个错误,你有一个拼写错误:
print str(tripeleit(3))
应该是:
print str(tripleit(3))