Ctypes赞成和反对

2024-09-28 23:24:08 发布

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

我听说Ctypes会在Python和windows中导致崩溃(或停止错误)。我应该远离它们吗?我在哪里听到的?那是在我试图控制windows的各个方面,自动化,诸如此类的事情的时候。在

我听说过swig,但我经常看到Ctypes。这里有危险吗?如果是,我应该注意什么?在

我搜索了cype pro con python。在


Tags: windows错误ctypes事情conproswigcype
3条回答

ctypes确实会导致崩溃,如果您使用的C库已经可以导致崩溃。在

如果有的话,ctypes可以帮助减少崩溃,因为您可以使用ctypes在C函数上使用the ^{} property来实施运行时类型安全。在

但是,如果您的C库已经稳定并经过测试,那么绝对没有理由不使用ctypes,如果它执行了将C和Python结合在一起所需要的功能。在

在健壮性方面,我仍然认为swig比ctypes有一定的优越性,因为它可以让C编译器为您更彻底地检查事情;但是,这现在还没有什么意义(尽管它在前面的ctypes版本中显得更大了),这要感谢前面提到的argtypes特性@Mark。然而,毫无疑问,对于ctypes来说,运行时开销比swig(以及sip和boostpython以及其他“包装”方法)更重要:因此,我认为ctypes是在调用发生在关键瓶颈之外时访问DLL中的几个函数的一种方便方法,而不是使大型C库可用于性能危急情况下的Python。在

为了在swig&c的运行时性能和ctypes的便利性之间找到一个很好的中间方法,同时还可以添加更多的代码,这些代码可以使用Python语法的子集,但运行速度仅为c代码的速度,还要考虑Cython——一种类似python的语言,可以编译成C语言,专门用于编写python可调用扩展和包装C库(包括那些可能仅作为静态库而不是DLL提供的扩展):ctypes不允许您使用那些那些;-)。在

如果使用正确,ctypes是一个安全的模块。在

有些库提供对事物的较低层次的访问,有些模块只允许您自取其辱。因此,自然有些模块比其他模块更危险。但这并不意味着你不应该使用它们!在

你可能听到有人这样说:

#Crash python interpreter
from ctypes import *
def crashme():
    c = c_char('x')
    p = pointer(c)
    i = 0
    while True:
            p[i] = 'x'
            i += 1

python解释器崩溃与python代码本身因运行时错误而出错不同。例如,设置了默认递归限制的无限递归将导致运行时错误,但python解释器之后仍然是活动的。在

另一个很好的例子是sys模块。但是您不会停止使用sys模块,因为它会使python解释器崩溃。在

^{pr2}$

还有许多库提供较低级别的访问。例如,可以操纵gc模块来访问部分构造的对象,访问这些对象的字段可能会导致崩溃。在

参考文献和观点来自:Crashing Python

相关问题 更多 >