Ctypes за и против - PullRequest
       32

Ctypes за и против

7 голосов
/ 23 августа 2009

Я слышал, что Ctypes может вызывать сбои (или останавливать ошибки) в Python и Windows. Должен ли я держаться подальше от их использования? Где я слышал? Он вернулся, когда я попытался контролировать различные аспекты окон, автоматизации и тому подобное.

Я слышу о глотке, но вижу Ctypes чаще, чем нет. Здесь есть какая-нибудь опасность? Если да, то на что мне следует обращать внимание?

Я действительно искал contype для ctype pro.

Ответы [ 4 ]

13 голосов
/ 23 августа 2009

С точки зрения надежности, я все еще думаю, что swig несколько превосходит ctypes, потому что можно заставить компилятор C более тщательно проверять вещи; однако, это довольно спорный момент (хотя он выглядел больше в более ранних версиях ctypes), благодаря уже упомянутой функции argtypes @Mark. Тем не менее, нет никаких сомнений в том, что издержки времени выполнения гораздо более значимы для ctypes, чем для swig (и для sip и boost python, и для других подходов «обтекания»): так что я думаю о ctypes как об удобном способе достижения некоторых функций в рамках DLL, когда вызовы происходят вне ключевого узкого места, а не для того, чтобы сделать большие библиотеки C доступными для Python в критических ситуациях.

Для хорошего среднего пути между производительностью swig (& c) во время выполнения и удобством ctypes, с дополнительным бонусом в виде возможности добавлять больше кода, который может использовать подмножество синтаксиса Python, и при этом работать примерно на C-коде скорости, также рассмотрим Cython - Python-подобный язык, который компилируется до C и специализируется на написании Python-вызываемых расширений и упаковочных библиотек C (включая те, которые могут быть доступны только как статические библиотеки, но не DLL). : ctypes не позволит вам играть с этими ; -).

5 голосов
/ 23 августа 2009

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

3 голосов
/ 23 августа 2009

ctypes действительно может вызвать сбои, если используемая вами библиотека C может уже вызвать сбои.

Во всяком случае, ctypes может помочь уменьшить сбои, потому что вы можете обеспечить безопасность типов во время выполнения с помощью свойства argtypes в функциях C, используя ctypes.

Но если ваша библиотека C уже стабильна и протестирована, нет абсолютно никаких причин не использовать ctypes, если она выполняет то, что вам нужно с точки зрения объединения C и Python.

2 голосов
/ 24 августа 2009

Я настоятельно рекомендую вам изучить эту книгу:

Grey Hat Python: программирование на Python для хакеров и реверс-инженеров

Книга выполняет функции углубленного учебника для библиотеки ctypes и показывает, как выполнять невероятно низкоуровневый код

...