Python/Cython导入文件和方法有问题

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)

对不起,如果这是超级基本的,但我似乎无法搞清楚.

Sau*_*tro 6

问题在于go.py:

from cy1 import timestwo
print str(timestwo(5))
Run Code Online (Sandbox Code Playgroud)

您正在尝试导入定义为的函数cdef.

要将此函数公开给Python,您必须使用defcpdef.可能你必须保持从其他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功能了.