2010-11-22 30 views
15

Estoy experimentando con las funciones de python en este momento. Encontré una manera de importar funciones de Python en código c/C++, pero no al revés.Importar la función C++ al programa Python

Tengo un programa de C++ escrito y tiene una función determinada en él. Me gustaría "importar" el programa compilado de C++ en mi script python y llamar a la función C++.

Por simplicidad, dicen que la función C++ es tan simple como:

int square(x) 
{ 
    return x*x; 
} 

y el programa compilado se llama Cprog.

Me gustaría que mi script en Python a ser algo así como:

import Cprog 

print Cprog.square(4) 

es esto posible? He buscado en Internet sin éxito y espero que alguno de ustedes, los gurús, tengan una forma inteligente de hacerlo ...

+2

¿Has probado Boost :: Python? – robbrit

+0

No, no. Pero parece que podría hacer lo que yo quiero. Estoy investigando en este momento. ¡Muchas gracias! ¿Alguien sabría de una manera menos complicada de hacer esto sin embargo (sin el uso de un módulo de tercera rueda)? – Nick

Respuesta

8

Si construye su programa como una biblioteca/DLL compartida, podría usar ctypes para llamarlo

import ctypes 
print ctypes.windll.cprog.square(4) # windows 
print ctypes.CDLL('cprog.so').square(4) # linux 
+0

Me olvidé de los tipos, definitivamente el camino a seguir si solo son un par de funciones que quiere exponer. – DaedalusFall

+0

¿Cuál es la mejor manera de crear un archivo * .so? Lo siento, no soy un programador/científico de computadoras, y mi comando g ++ generalmente está en la línea de "g ++ Ccode.cpp -o Cfile". Intenté usar -compartido como una opción adicional junto con la línea de linux sugerida anteriormente y recibí un error. No creo haber creado mi archivo * .so correctamente ... ¿algún consejo? – Nick

+0

@Nick: Esa es una pregunta diferente, una que ya se ha preguntado: http://stackoverflow.com/questions/3588476/building-a-shared-library-using-gcc – SingleNegationElimination

3

Necesita crear un módulo de python con esa función. Hay tres formas principales:

  1. Usando Swig - esto lee su código c y crea un módulo python a partir de él.
  2. Codificado a mano usando python c api.
  3. Usando Boost :: Python (a menudo la forma más fácil).

This pdf cubre 1 y 2. This page le dirá cómo usar Boost :: Python.

No puede usar (fácilmente) una función que está en un programa c/C++, debe estar en una biblioteca estática (a la que también puede vincular su programa c/C++).

EDITAR - Cython También merece una mención.

+3

¿Se refiere a Swig? –

+0

¡ja! Uy! de hecho lo hice – DaedalusFall

0

Hay muchas maneras diferentes de ajustar el código de C++ para ser utilizado en Python. La mayoría aparecen en la wiki de Python here.

He encontrado una manera decentemente fácil de automatizarlo es usar py++ para generar automáticamente los envoltorios, luego compilar los archivos generados. Pero esto es más apropiado para proyectos más grandes donde envolver todo a mano no es muy factible y causaría una pesadilla de mantenimiento.

+0

py ++ enlace está roto – SAAD

21

He aquí una pequeña parte de la terminación del sencillo ejemplo anterior. Aunque el hilo es viejo, creo que es útil contar con una guía simple para principiantes, porque también tuve algunos problemas antes.

función.contenido CPP (extern "C" que se utiliza para que ctypes módulo puede manejar la función):

extern "C" int square(int x) 
{ 
    return x*x; 
} 

contenido wrapper.py:

import ctypes 
print ctypes.windll.library.square(4) # windows 
print ctypes.CDLL('library.so').square(4) # linux or when mingw used on windows 

a continuación, compilar el archivo function.cpp (utilizando MinGW por ejemplo):

g++ -shared -c -fPIC function.cpp -o function.o 

a continuación, crear la biblioteca de objetos compartidos con el siguiente comando (nota: no en todas partes son espacios en blanco):

g++ -shared -Wl,-soname,library.so -o library.so function.o 

A continuación, ejecute wrapper.py y el programa debería funcionar.

Cuestiones relacionadas