gpt4 book ai didi

python - 在这个非常简单的 cython 程序中不断出现难以理解的错误

转载 作者:行者123 更新时间:2023-11-28 19:04:05 26 4
gpt4 key购买 nike

这是我非常简单的 cython 程序。

test/__init__.py(空白文件)

test/__main__.py(主文件)

from test.program import Program
Program.Main([])

test/program.pyx

from .example import *
from .example cimport *

class Program:
@staticmethod
def Main(args):
h = ExampleClass()
h.SayHi()

test/example.pyx

cdef class ExampleClass:
cdef SayHi(self):
print("HI")

test/example.pxd

cdef class ExampleClass:
cdef SayHi(self)

如果我通过 py36 test/__main__.py 运行这个程序,程序会输出这个无法理解的错误。

Traceback (most recent call last):
File "test\__main__.py", line 1, in <module>
from test.program import Program
File "test\program.pyx", line 1, in init test.program
from .example import *
TypeError: Cannot overwrite C type ExampleClass

如果我修改代码

from .example import *
from .example cimport *

到以下代码块之一

from .example import ExampleClass
from .example cimport *

from .example import *
from .example cimport ExampleClass

from .example import ExampleClass
from .example cimport ExampleClass

,错误消失,程序运行良好,没有错误。

我真的不明白为什么原始未修改的代码输出奇怪的 TypeError: Cannot overwrite C Type ExampleClass..有人可以帮我理解错误和问题所在吗?

最佳答案

program.pyx ,同时使用了 Python 模块和 Cython 导入。

example.pyx代码已编译,ExampleClass已经被定义为原生类型。

然后 python 级导入指示 python 解释器加载包含 ExampleClass 的 python 模块 native 类型 - 注意,不是它的 Cython 定义,而是运行时 python 模块。

由于该类型已在编译时由 Cython 使用 a fixed definition 声明,它被视为重新声明 native 类型的尝试。那就是TypeError: Cannot overwrite C type ExampleClass意味着。

换句话说,python 级导入试图重新声明一个静态定义的 C 扩展类,这是 Cython 不允许的。

简而言之,删除from .example import <..>来自 .pyx 的行文件。

只有在只有 Python 的情况下才需要 Python 级别的导入,如常规 .py文件,而 Cython 仅声明两者都需要使用 - 上述情况并非如此。

附带说明,Cython 的 cimport 不支持相对导入并且最好不要使用 *用于进口。亲戚cimport当作为包安装时,代码将中断。

关于python - 在这个非常简单的 cython 程序中不断出现难以理解的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48989902/

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