omg*_*wot 3 python cython importerror python-2.7
有两个与导入相关的问题可能是也可能不是cython相关的?
我有以下简化文件来重新创建问题.所有文件都在同一目录中.该.pyx文件已经成功地编入*.so,*.pyc和*.c文件.
setup.py:
from distutils.core import setup
from Cython.Build import cythonize
setup(
ext_modules=cythonize("*.pyx"),
)
Run Code Online (Sandbox Code Playgroud)
cy1.pyx :( cython)
cdef int timestwo(int x):
return x * 2
Run Code Online (Sandbox Code Playgroud)
cy1.pxd:
cdef int timestwo(int x)
Run Code Online (Sandbox Code Playgroud)
cy3.py :(普通蟒蛇)
def tripleit(x):
return x*3
Run Code Online (Sandbox Code Playgroud)
go.py:
from cy1 import timestwo
print str(timestwo(5))
Run Code Online (Sandbox Code Playgroud)
给我错误:ImportError:无法导入名称timestwo
如果我改为:
go.py:
import pyximport; pyximport.install()
import cy1
print str(cy1.timestwo(5))
Run Code Online (Sandbox Code Playgroud)
它告诉我:AttributeError:'module'对象没有属性'timestwo'
如果我一起取出cython并尝试使用来自cy3.py的普通python调用:
go.py:
import cy3
print str(cy3.tripeleit(3))
Run Code Online (Sandbox Code Playgroud)
我得到:AttributeError:'module'对象没有属性'tripeleit'
如果我这样做,最后:
go.py:
from cy3 import tripleit
print str(tripeleit(3))
Run Code Online (Sandbox Code Playgroud)
我明白了:
NameError: name 'tripeleit' is not defined
Run Code Online (Sandbox Code Playgroud)
对不起,如果这是超级基本的,但我似乎无法搞清楚.
问题在于go.py:
from cy1 import timestwo
print str(timestwo(5))
Run Code Online (Sandbox Code Playgroud)
您正在尝试导入定义为的函数cdef.
要将此函数公开给Python,您必须使用def或cpdef.可能你必须保持从其他Cython文件的cdef顺序cimport,证明为什么你也有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)
Run Code Online (Sandbox Code Playgroud)
和你的cy1.pxd文件:
cdef int ctimestwo(int x)
Run Code Online (Sandbox Code Playgroud)
这样你就可以cimport只使用这个ctimestwo功能了.
| 归档时间: |
|
| 查看次数: |
5642 次 |
| 最近记录: |