gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:16:59 25 4
gpt4 key购买 nike

有两个问题都与导入有关,可能与 cython 相关,也可能不相关?

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

设置.py:

from distutils.core import setup
from Cython.Build import cythonize

setup(
ext_modules=cythonize("*.pyx"),
)

cy1.pyx:(赛通)

cdef int timestwo(int x):
return x * 2

cy1.pxd:

cdef int timestwo(int x)

cy3.py:(普通 python )

def tripleit(x):
return x*3

go.py:

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

给我错误:ImportError: cannot import name timestwo

如果我把它改成:

go.py:

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

它告诉我:AttributeError: 'module' object has no attribute 'timestwo'

如果我一起取出 cython 并尝试使用来自 cy3.py 的普通 python 调用:

go.py:

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

我得到:AttributeError: 'module' object has no attribute 'tripeleit'

最后如果我这样做了:

go.py:

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

我得到:

NameError: name 'tripeleit' is not defined

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

最佳答案

问题是在 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)

这样您就可以cimportctimestwo 函数。

关于Python/Cython 导入文件和方法时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26417762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com