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

时间:2014-10-17 04:14:28

标签: python python-2.7 cython importerror

有两个与导入有关的问题可能与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

很抱歉,如果这是超级基本的,但我似乎无法弄明白。

2 个答案:

答案 0 :(得分:5)

问题在于go.py

from cy1 import timestwo
print str(timestwo(5))

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

要将此功能公开给Python,您必须使用defcpdef。可能你必须保持cdefcimport来自其他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)

这样您就可以cimportctimestwo功能。

答案 1 :(得分:1)

关于你的第二个错误,你有一个拼写错误:

print str(tripeleit(3))

应该是:

print str(tripleit(3))