我听说Ctypes会导致Python和Windows崩溃(或停止错误)。我应该远离他们的使用吗?我在哪里听到的?当我试图控制Windows,自动化等各方面时,它又回来了。
我听说过swig,但我经常看到Ctypes。这有危险吗?如果是这样,我应该注意什么?
我确实搜索了ctype pro con python。
答案 0 :(得分:13)
就稳健性而言,我仍然认为swig在某种程度上优于ctypes,因为有可能让C编译器为您更彻底地检查事物;然而,由于@Mark已经提到的argtypes
特征,这在现在已经很少了(虽然它在早期的ctypes版本中显得更大)。但是,毫无疑问,运行时开销对于ctypes比对swig(以及sip和boost python以及其他“包装”方法)更重要:因此,我认为ctypes是一种方便的方法来实现其中的一些功能当调用发生在关键瓶颈之外时的DLL,而不是在性能关键的情况下使Python可以使用大型C库的方法。
在swig(& c)的运行时性能和ctypes的便利性之间有一个很好的中间路径,还有一个额外的好处,就是能够添加更多可以使用Python语法子集的代码,但只需要在C运行代码速度,也考虑Cython - 一种类似python的语言,可编译为C,专门用于编写Python可调用扩展和包装C库(包括那些只能作为静态库而不是DLL使用的库) :ctypes不会让你玩那些; - )。
答案 1 :(得分:5)
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模块以访问部分构造的对象,访问其中的字段可能导致崩溃。
参考和想法来自:Crashing Python
答案 2 :(得分:3)
ctypes
确实可能导致崩溃,如果你正在使用的C库已经导致崩溃。
如果有的话,ctypes
可以帮助减少崩溃,因为您可以使用ctypes
在C函数上使用the argtypes
property强制运行时类型安全。
但是如果你的C库已经稳定并经过测试,那么如果它在将C和Python结合在一起的情况下执行你所需要的,那么绝对没有理由不使用ctypes
。
答案 3 :(得分:2)
我强烈建议你去阅读这本书:
Gray Hat Python: Python Programming for Hackers and Reverse Engineers
本书作为ctypes库的深入教程,向您展示如何运行令人难以置信的低级代码