我听说Ctypes会导致Python和Windows崩溃(或停止错误).我应该远离他们的使用吗?我在哪里听到的?当我试图控制Windows,自动化等各方面时,它又回来了.
我听说过swig,但我经常看到Ctypes.这有危险吗?如果是这样,我应该注意什么?
我确实搜索了ctype pro con python.
在稳健性方面,我仍然认为swig在某种程度上优于ctypes,因为有可能让C编译器为您更彻底地检查事物; 然而,由于argtypes
@Mark已经提到的功能,现在这已经没什么问题了(虽然它在早期的ctypes版本中显得更大).但是,毫无疑问,运行时开销对于ctypes比对swig(以及sip和boost python以及其他"包装"方法)更重要:因此,我认为ctypes是一种方便的方法来实现其中的一些功能当调用发生在关键瓶颈之外时的DLL,而不是在性能关键的情况下使Python可以使用大型C库的方法.
对于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解释器.
import sys sys.setrecursionlimit(2**30) def f(x): f(x+1) #This will cause no more resources left and then crash the python interpreter f(1)
还有许多库提供较低级别的访问权限.例如,可以操纵gc模块以访问部分构造的对象,访问其中的字段可能导致崩溃.
参考和想法取自:崩溃的Python