¿Puedo usar funciones de C++ mientras extiendo Python?
-
19-09-2019 - |
Pregunta
El manual de Python dice que puedes crear módulos para Python tanto en C como en C++.¿Puedes aprovechar cosas como clases y plantillas cuando usas C++?¿No crearía incompatibilidades con el resto de bibliotecas y con el intérprete?
Solución
No importa si su implementación de las funciones de enlace se implementa en C o en C++.De hecho, ya he visto algunas extensiones de Python que hacen uso activo de plantillas de C++ e incluso de la biblioteca Boost. Ningún problema. :-)
Otros consejos
La gente a impulsar tienen una forma automatizada agradable para hacer la envoltura de código C ++ para el uso de pitón.
Se llama: Boost.Python
Se trata de algunas de las construcciones de C ++ mejor que SWIG, metaprogramming particularmente plantilla.
Lo que le interesa es un programa llamado TRAGO . Será generar contenedores Python e interfaces para código C ++. Yo lo uso con plantillas, herencia, espacios de nombres, etc. y funciona bien.
Usted debe ser capaz de utilizar todas las características del lenguaje C ++. El La extensión de la documentación de Python (2.6.2) dice que usted puede usar C ++, pero las menciones las salvedades siguiendo:
Es posible escribir la extensión módulos en C ++. algunas restricciones aplicar. Si el programa principal (el pitón intérprete) se compila y se enlaza por el compilador de C, global o estática objetos con los constructores no pueden ser usado. Esto no es un problema si el programa principal está vinculada por el C ++ compilador. Funciones que serán llamado por el intérprete de Python (en en particular, la inicialización del módulo funciones) tienen que ser declarada usando extern "C". Es innecesario adjuntar los archivos de cabecera en Python extern "C" {...} - que utilizan esta forma Ya si el símbolo es __cplusplus (compiladores todo reciente C ++ definidos definir este símbolo).
La primera restricción, "objetos globales o estáticas con constructores no pueden ser utilizados", tiene que ver con la manera más compilador de C ++ inicializar objetos con este tipo de tiempo de almacenamiento. Por ejemplo, considere el siguiente código:
class Foo { Foo() { } };
static Foo f;
int main(int argc, char** argv) {}
El compilador tiene que emitir un código especial para que el constructor 'Foo' se invoca para la 'f' antes principal es ejecutado. Si tiene objetos con una duración de almacenamiento estático en su extensión de Python y el intérprete de Python no se compila y se enlaza para C ++, entonces este código especial de inicialización no se creará.
La segunda restricción, "Funciones que será llamado por el intérprete de Python (en particular, las funciones del módulo de inicialización) tienen que ser declaradas usando extern 'C'", tiene que ver con C ++ nombre mangling. La mayoría de los compiladores de C ++ mangle sus nombres para que puedan utilizar los mismos enlazadores previstas toolchains C. Por ejemplo decir que tenía:
void a_function_python_calls(void* foo);
compilador de C ++ pueden convertir referencias al nombre 'a_function_python_calls' a algo así como 'a_function_python_calls @ 1VGA'. En cuyo caso se puede obtener una asignatura pendiente externa al intentar enlazar con la biblioteca de Python.