Python/Cython导入文件和方法时遇到问题

2024-06-26 13:32:14 发布

您现在位置:Python中文网/ 问答频道 /正文

有两个与进口有关的问题可能与cython有关,也可能与cython无关?

我有以下简化文件来重新创建问题。所有文件都在同一目录中。.pyx文件已成功编译为*.so*.pyc*.c文件。

设置.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

周期1.pxd:

cdef int timestwo(int x)

cy3.py:(普通python)

def tripleit(x):
    return x*3

开始时间:

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

给出错误:importTerror:无法导入名称times2

如果我改成:

开始时间:

import pyximport; pyximport.install()
import cy1
print str(cy1.timestwo(5))

它告诉我:attributeRor:“module”对象没有属性“timestwo”

如果我将cython全部取出,并尝试使用cy3.py中的普通python调用:

开始时间:

import cy3
print str(cy3.tripeleit(3))

我得到:attributeRor:“module”对象没有属性“tripleIt”

最后,如果我这样做了:

开始时间:

from cy3 import tripleit
print str(tripeleit(3))

我得到:

NameError: name 'tripeleit' is not defined

抱歉,如果这是超基本的,但我似乎无法搞清楚。


Tags: 文件frompyimportsetup时间cythonint
2条回答

关于第二个错误,您有一个错误:

print str(tripeleit(3))

应该是:

print str(tripleit(3))

问题是在go.py中:

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

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

要向Python公开此函数,必须使用defcpdef。可能您必须保留为cdef,以便从其他Cython文件中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)

以及您的cy1.pxd文件:

cdef int ctimestwo(int x)

这样您就可以cimport只使用ctimestwo函数。

相关问题 更多 >