2009-08-23 11 views
7

He oído que Ctypes puede causar bloqueos (o detener errores) en Python y Windows. ¿Debo mantenerme alejado de su uso? ¿Dónde lo escuché? Volvió cuando traté de controlar varios aspectos de Windows, automatización, ese tipo de cosas.Ctypes pro and con

He oído hablar de swig, pero veo Ctypes casi siempre. ¿Algún peligro aquí? Si es así, ¿qué debería tener cuidado?

He buscado ctype pro con python.

+0

Tantas buenas respuestas, tengo que pensar sobre esto y posiblemente comentar más sobre cada respuesta. No es de extrañar que me encanta este sitio. – phreaki

Respuesta

13

En términos de robustez, sigo pensando que el trago es algo superior a los ctypes, porque es posible que un compilador de C verifique las cosas más a fondo para usted; sin embargo, esto es bastante discutible por ahora (mientras que se avecinaba más grande en versiones anteriores de tipos), gracias a la función argtypes que ya se mencionó en la Marca. Sin embargo, no hay duda de que la sobrecarga de tiempo de ejecución ES mucho más significativa para los tipos que para el trago (y sip y potenciar python y otros enfoques de "envoltura"): entonces, pienso en los tipos como una manera conveniente de alcanzar algunas funciones dentro una DLL cuando las llamadas suceden fuera de un cuello de botella clave, no como una forma de hacer que grandes bibliotecas de C estén disponibles para Python en situaciones de rendimiento crítico.

Por un camino intermedio buena entre el rendimiento de ejecución del trago (& c) y la conveniencia de ctypes, con la ventaja añadida de ser capaz de añadir más código que puede utilizar un subconjunto de la sintaxis de Python todavía funciona en casi C -code, también considere Cython - un lenguaje similar a python que compila hasta C y está especializado para escribir extensiones llamables de Python y envolver bibliotecas C (incluidas aquellas que pueden estar disponibles solo como bibliotecas estáticas, no como DLL: ctypes wouldn ' Te dejo jugar con esos ;-).

5

ctypes es un módulo seguro para usar, si lo usa correctamente.

Algunas bibliotecas proporcionan un acceso de nivel inferior a las cosas, algunos módulos simplemente le permiten dispararse en el pie. Entonces, naturalmente, algunos módulos son más peligrosos que otros. ¡Esto no significa que no deberías usarlos!

Usted probablemente ha escuchado a alguien referirse a algo como esto:

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

La pitón intérprete estrellarse es diferente que sólo el código Python en sí erroring a cabo con un error de ejecución. Por ejemplo, la recursión infinita con un conjunto de límites de recursión predeterminado provocaría un error de tiempo de ejecución pero el intérprete de Python seguiría vivo después.

Otro buen ejemplo de esto es con el módulo sys. Sin embargo, no dejaría de usar el módulo sys porque puede bloquear el intérprete de 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) 

Hay muchas bibliotecas que proporcionan un acceso de nivel inferior. Por ejemplo, el módulo The gc se puede manipular para dar acceso al objeto parcialmente construido, accediendo a los campos que pueden causar bloqueos.

de referencia y las ideas tomadas de: Crashing Python

+1

Dado que normalmente rompo un poco las cosas, esta es una buena visión general de los tipos que desconocía. – phreaki

3

ctypes de hecho puede causar accidentes, si la biblioteca de C que usted está utilizando puede ya accidentes causa.

En todo caso, ctypes puede ayudar a reducir los bloqueos, ya que puede aplicar la seguridad del tipo de tiempo de ejecución con the argtypes property en las funciones C usando ctypes.

Pero si su biblioteca C ya es estable y ha sido probada, no hay absolutamente ninguna razón para no usar ctypes si realiza lo que necesita en términos de reunir C y Python.

+0

Por supuesto, para lo que podría usarlo no es mi código C. Esto podría darme una razón para aprender más de lo que sé. – phreaki

2

le recomiendo que mire en la lectura de este libro:

Gray Hat Python: Python Programming for Hackers and Reverse Engineers

Las funciones de la guía como un tutorial detallado para la biblioteca ctypes, y le muestra cómo ejecutar increíblemente bajo nivel de código

+0

Por favor, explica por qué. No es que dude de ti (y soy dueño de este libro), pero sería útil saber tus razones. –

+0

Yo también. No estoy tanto en hackear o invertir nada aquí. Quería acceder a partes de mi máquina que Python no veía con facilidad. – phreaki

+0

Si aprende el mismo tipo de cosas que los hackers e ingenieros reverso necesitan saber para sus propósitos, también aprenderá cómo se pueden aplicar esas técnicas para "acceder a partes de su máquina que Python no ve fácilmente" –