Traducción Python Bindings CUADRO RESUMEN DE _ Para continuar

Python Bindings general

Wen dirección de origen

1. Descripción general vinculante pitón

Antes de investigación pitón cómo llamar a C, es necesario tener en cuenta por qué. llamada pitón C por lo general tienen los siguientes escenarios de uso:

  1. Después ya tiene una biblioteca grande, bien probadas y estables de C ++, mientras que la esperanza de combinar las ventajas del lenguaje python. Esta biblioteca es a menudo una biblioteca de comunicación o bibliotecas específicas de hardware y de diálogo;
  2. Aceleración de un módulo de código Python, el código necesario para pitón código respectiva módulo de transferencia C;
  3. Con pitón automatizado herramientas de prueba para las pruebas del sistema a gran escala;
    si hay varios requisitos arriba para aprender vinculante pitón tecnología es muy necesario.
    (Nota: El artículo película explicará cómo crear una unión a C / C ++ Python, pero la mayoría de las herramientas sólo admiten la C o C ++, para el C y C ++ llama idea es la misma)

1.1 Tipos de datos Marshalling

En primer lugar, vistazo a la forma de pitón y almacenar datos C ¿Qué similitudes y diferencias, la diferencia conducirán a qué? Wikipedia de cálculo de referencias definiciones: . La memoria del proceso de la representación de objetos Transformación de una A de datos al formato adecuado para su almacenamiento o transmisión (la Fuente) . Baidu Enciclopedia definición de de clasificación: Informática la representación memoria del objeto se convierte en un formato de datos adecuado para el proceso de transmisión o almacenamiento.

pitón aportar al contenido vinculante contiene de clasificación técnica: la transferencia de datos desde la pitón en C / C ++. Lo hizo debido a la pitón diferentes formas y C / C ++ para el almacenamiento de datos, C los datos almacenados en la memoria es muy estrecho y eficiente.

Y en pitón, todas las cosas son objetos, lo que significa que cada tipo de variable entera varios bytes en la memoria, en función del número específico de bytes versión pitón, versión del sistema operativo sean. Cuando tal un pitón de interactuar y C, C cada una de las variables de tipo entero necesita ser convertido en una variable de tipo entero del pitón.

El al igual que otros tipos de estructuras de datos y estructuras de datos de tipo entero.

La pitón número entero tipo de variable de precisión arbitraria cuando, en intger medios PY pueden almacenar un número muy grande, en C, las variables de tipo int almacena en la longitud especificada. Debe quedar claro en el rango de tamaño de llamada digital entre sí, a fin de evitar desbordamiento de entero py en C.

Las variables de tipo float similares, deben ser conscientes de los números de rango y precisión.

Tipo de variable compleja **: py ** tiene un sistema incorporado en variables complejas de tipo, C es también un complejo de tipo de variable, no hay está incorporado en el método de cálculo de referencias entre los mismos. Si se desea complejo Mariscal, la necesidad de una estructura o una clase de auto auto en C ++ complejo para gestionar los tipos de variables en C.

tipo variable de cadena : la secuencia representativa de caracteres, tales tipos de datos genéricos Marshal puede ser muy difícil entre el pitón y C. A diferencia de otros tipos de variables, py y C almacenados en el anterior son muy diferentes, C y C ++ en este sentido existen diferencias sutiles.

bool tipo de variable: tipo bool variable de manera muy directa por lo general mariscal, porque sólo dos valores bool.

Además de las conversiones de tipos de datos, hay otras cuestiones que tendrá que pensar a medida que construye sus enlaces Python. torreón Vamos a explorarlas.

1.2 comprensión de los valores mutables e inmutables

tipos de datos pitón en un tipo variable y tipo inmutable, así mismo hay una llamada por llamada y una diferencia de referencia en la llamada de función C. Pasar las llamadas de valores de parámetros por defecto C, si un cambio en una variable en una función, la necesidad de pasar un puntero a la variable de función.

¿Es posible pasar directamente a través de un pitón a C inmutable puntero de objeto Tipo de ir sobre este tema? Py por lo general no le dará un objeto puntero py, por lo que este método no funcionará. Para lograr un cambio en C py objeto requiere pasos adicionales para poner en práctica estas medidas depende de qué herramientas específicos que utilice, estos se mencionan a continuación.

Por lo tanto, se puede añadir la inmutabilidad de su lista de comprobación de los elementos a considerar al crear enlaces Python. Su última parada en la gran gira de crear esta lista de verificación es cómo manejar las diferentes formas en que Python y C se ocupan de la gestión de memoria.

Memoria 1.3 Gestión

C y py para diferentes gestión de memoria. C, los desarrolladores debe gestionar la asignación de memoria y la liberación de todas las variables, y para asegurar que la memoria se libera sólo una vez. Py gestionar la memoria a través de la recolección de basura.

Ambos métodos tienen sus ventajas, pero al mismo tiempo Py tecnología de unión para aumentar la dificultad. Requiere que cada objeto debe asignar claramente espacio en la memoria, la memoria debe asegurarse de que la liberación se crea en el mismo lado. En py como la creación de un objeto: x = 3, se asigna memoria en Python, por un lado, y la necesidad de recolección de datos innecesarios, con py que no es necesario hacer mucho trabajo. Sin embargo, en C o la conversión de dicha memoria una variable asignada, necesidad de realizar el siguiente código:

int* iPtr = (int*)malloc(sizeof(int));

Después de la asignación de memoria también es necesario para garantizar puntero del FPR se dará a conocer más adelante. Esto puede ser necesario añadir código en Python para lograr.

Que completa su lista de temas generales. Vamos a empezar a configurar el sistema para que pueda escribir algo de código!

ambiente 1.4 build

En esta sección se requiere el uso de pre-existente bibliotecas de C y C ++ para probar cada herramienta vinculante, es necesario instalar por sí mismos con el medio ambiente:

  • Una biblioteca de C ++ instalado y el conocimiento de la ruta para la invocación de línea de comandos

  • Python herramientas de desarrollo:

    • Para Linux, este es el paquete python3-dev o python3-devel, dependiendo de su distribución.
    • Para Windows, hay varias opciones .
  • Python 3.6 o mayor

  • Un entorno virtual (recomendado, pero no es obligatorio)

  • La herramienta de invocación

El último de ellos podría ser nuevo para usted, así que vamos a echar un vistazo más de cerca.

1.5 Uso de la herramienta de invocación

Se utiliza en este tutorial de invocación py unión de construido y probado. Hay invocar una función se construye utilizando py lugar ser construido por makefile. herramientas de instalación de invocación Py en:

$ python3 -m pip install invoke

Para ejecutarlo, tipo de invocación seguido por la tarea que desee ejecutar:

$ invoke build-cmult
==================================================
= Building C Library
* Complete
To see which tasks are available, you use the --list option:

$ invoke --list

Available tasks:

  all              Build and run all tests
  build-cffi       Build the CFFI Python bindings
  build-cmult      Build the shared library for the sample C code
  build-cppmult    Build the shared library for the sample C++ code
  build-cython     Build the cython extension module
  build-pybind11   Build the pybind11 wrapper library
  clean            Remove any built objects
  test-cffi        Run the script to test CFFI
  test-ctypes      Run the script to test ctypes
  test-cython      Run the script to test Cython
  test-pybind11    Run the script to test PyBind11

Tenga en cuenta que la lista anterior es la segunda acumulación CFFI, nombre de archivo correspondiente pitón es build_cffi, porque "-" no se puede utilizar como parte del nombre de la PY.

Cada uno de unión corresponde herramienta a una acumulación de tareas y la prueba en tareas, como la ejecución de código CFFI necesidad para escribir invoke build-cffi/test-cffi. ctypes es una excepción, ya que los ctypes proceso no se acumulan. Hay dos comandos especiales:

  • invoke all ejecuta las tareas de construcción y de prueba para todas las herramientas.
  • invoke clean elimina todos los archivos generados.

Ahora que usted tiene una idea de cómo ejecutar el código, vamos a echar un vistazo en el código C podrás envoltura antes de golpear el panorama herramientas.

1.6 C o C ++ Fuente

En capítulos posteriores se crearán mismas fijaciones de función py para C / C ++, el propósito es dar al lector una visión general de las características de cada método, por lo que por lo general es una función de los envases será relativamente pequeña. Función se implementa utilizando una función de entrada y una int variables de tipo flotador, devoluciones flotador el producto de ambos tipos.

// cmult.c
float cmult(int int_param, float float_param) {
    float return_value = int_param * float_param;
    printf("    In cmult : int: %d float %.1f returning  %.1f\n", int_param,
            float_param, return_value);
    return return_value;
}

Las funciones de C y C ++ son casi idénticos, con el nombre de menor importancia y de cadena diferencias entre ellos. Usted puede obtener una copia de todo el código haciendo clic en el siguiente enlace:

Obtener código de ejemplo: Haga clic aquí para obtener el código de ejemplo que vamos a usar para aprender sobre Python Bindings en este tutorial.

Ahora que tienes el repositorio clonado y sus herramientas instalado, puede construir y probar las herramientas. Así que vamos a bucear en cada sección de abajo!

2. ctypes

Vamos a empezar con ctypes, que es una herramienta en la biblioteca estándar para la creación de enlaces Python. Se proporciona un conjunto de herramientas de bajo nivel para las bibliotecas de carga compartida y los datos de clasificación entre Python y C.

¿Cómo se instala

Una de las ventajas es que pertenece a ctypes pitón biblioteca estándar. Se introdujo a 2,5 pitón ==, la instalación de pitón ya tienen esta biblioteca, el lector puede importar ctypes importar sys y módulos de tiempo como el mismo.

Llamada de la función

Cargar y llamar a la C funciones de biblioteca se realizan en el código Python. La ventaja de este tiempo no requiere pasos adicionales sólo tiene que ejecutar el programa, otras cosas se encargará automáticamente. Llevado a cabo utilizando ctypes enlace de Python, es necesario hacer las siguientes cosas:

  1. La carga de la biblioteca de importación Biblioteca.
  2. Envolver algunos de sus parámetros de entrada. Parámetros de entrada de embalaje
  3. Los ctypes Tell tipo de retorno de la función. Determina ctypes valor de retorno tipo de datos.

Carga biblioteca

ctypes proporciona varias maneras a las bibliotecas de carga compartida, e incluso algunos para una biblioteca plataforma de hardware específica. Por ejemplo, se puede pasar directamente a una ruta completa. A partir de la creación de un ctype.CDLL
que al cargar una biblioteca compartida, que son algunos de plataforma específica. El por su ejemplo, podrás objeto directamente por el Crear un ctypes.CDLL de paso en la ruta completa biblioteca compartida en Los ctypes la proporciona formas de 'varios' que desee:

# ctypes_test.py
import ctypes
import pathlib

if __name__ == "__main__":
    # Load the shared library into ctypes
    libname = pathlib.Path().absolute() / "libcmult.so"
    c_lib = ctypes.CDLL(libname)

Esto funciona para los casos en que la biblioteca compartida se encuentra en el mismo directorio que el script en Python, pero tenga cuidado cuando se intenta cargar bibliotecas que son de paquetes que no sean sus enlaces Python. Hay muchos detalles para la carga de bibliotecas y la búsqueda de caminos en la documentación ctypes que son la plataforma y de la situación específica.

NOTA: Muchos de los problemas específicos de la plataforma pueden surgir durante la carga de la biblioteca. Lo mejor es hacer cambios incrementales una vez que llegue un trabajo ejemplo.

Ahora que tiene la biblioteca cargado en Python, puede intentar llamar a él!

Situaciones que requieren Función
Recuerde que el prototipo de función para su función C es el siguiente:

// cmult.h
float cmult(int int_param, float float_param);

Tiene que pasar en un entero y un flotador y puede esperar para obtener un flotador regresó. Números enteros y los flotadores tienen soporte nativo tanto en Python y en C, por lo que espera este caso va a trabajar para valores razonables.

Una vez que haya cargado la biblioteca en sus enlaces de Python, la función será un atributo de c_lib, que es el objeto CDLL que creó anteriormente. Usted puede tratar de llamarlo como este:

x, y = 6, 2.3
answer = c_lib.cmult(x, y)

¡Huy! Esto no funciona. Esta línea se comenta en el ejemplo de recompra porque falla. Si intenta ejecutar con esa llamada, entonces Python se quejará con un error:

$ invoke test-ctypes
Traceback (most recent call last):
  File "ctypes_test.py", line 16, in <module>
    answer = c_lib.cmult(x, y)

ctypes.ArgumentError: Argumento 2: <clase 'TypeError'>: no se sabe cómo convertir el parámetro 2
Parece que necesita decir ctypes sobre cualquier parámetro que no son números enteros. ctypes no tiene ningún conocimiento de la función a menos que usted le indique de forma explícita. Cualquier parámetro que no está marcada de otro modo se supone que es un número entero. ctypes no sabe cómo convertir el valor 2.3 que se almacena en y a un entero, por lo que falla.

Para solucionar este problema, tendrá que crear un c_float del número. Usted puede hacer eso en la línea en la que está llamando a la función:

# ctypes_test.py
answer = c_lib.cmult(x, ctypes.c_float(y))
print(f"    In Python: int: {x} float {y:.1f} return val {answer:.1f}")
Now, when you run this code, it returns the product of the two numbers you passed in:
$ invoke test-ctypes
    In cmult : int: 6 float 2.3 returning  13.8
    In Python: int: 6 float 2.3 return val 48.0
Wait a minute… 6 multiplied by 2.3 is not 48.0!

Resulta que, al igual que los parámetros de entrada, ctypes supone que su función devuelve un int. En la actualidad, la función devuelve un flotador, que es cada vez marshalled incorrectamente. Al igual que el parámetro de entrada, es necesario contar ctypes usar un tipo diferente. La sintaxis aquí es ligeramente diferente:

# ctypes_test.py
c_lib.cmult.restype = ctypes.c_float
answer = c_lib.cmult(x, ctypes.c_float(y))
print(f"    In Python: int: {x} float {y:.1f} return val {answer:.1f}")

Eso debería hacer el truco. Vamos a ejecutar la totalidad del objetivo de prueba ctypes y ver lo que tienes. Recuerde, la primera sección de salida es antes de fijar la restype de la función de ser un flotador:

$ invoke test-ctypes
==================================================
= Building C Library
* Complete
==================================================
= Testing ctypes Module
    In cmult : int: 6 float 2.3 returning  13.8
    In Python: int: 6 float 2.3 return val 48.0

    In cmult : int: 6 float 2.3 returning  13.8
    In Python: int: 6 float 2.3 return val 13.8

¡Eso es mejor! Mientras que la primera versión, corregida está devolviendo el valor erróneo, su versión fija de acuerdo con la función C. Tanto C y Python consiguen el mismo resultado! Ahora que está funcionando, echar un vistazo a por qué puede o no puede querer usar ctypes.

Quitar anuncios

Fortalezas y debilidades

Los mayores ctypes ventaja tiene sobre las otras herramientas que examinaremos aquí es que está integrado en la biblioteca estándar. También se requiere ningún paso adicional, ya que todo el trabajo se realiza como parte de su programa de Python.

Además, los conceptos utilizados son de bajo nivel, lo que hace ejercicios como el que usted acaba de hacer manejable. Sin embargo, las tareas más complejas crecen engorroso con la falta de automatización. En la siguiente sección, verá una herramienta que añade un poco de automatización para el proceso.

3. YFC

Publicado 63 artículos originales · ganado elogios 52 · Vistas a 40000 +

Supongo que te gusta

Origin blog.csdn.net/weixin_41521681/article/details/104737792
Recomendado
Clasificación