2010-01-07 9 views
11

Estoy usando la biblioteca de Boost Python para crear extensiones de Python en mi código de C++. Me gustaría ser capaz de invocar la función de Python 'saludar' a partir del código C++ se muestra a continuación:building boost Ejemplos de python usando Visual Studio 2008

#include <boost/python/module.hpp> 
#include <boost/python/def.hpp> 

char const* greet() 
{ 
    return "hello, world"; 
} 

BOOST_PYTHON_MODULE(hello_ext) 
{ 
    using namespace boost::python; 
    def("greet", greet); 
} 

Y el código Python:

import hello_ext 
print hello_ext.greet() 

He conseguido hacer esto utilizando el bjam (hello_ext.pyd se genera y funciona bien), pero ahora me gustaría construirlo usando Visual Studio 2008. Se construye un hello.dll (pero ni hello_ext.dll ni ningún .pyd). Después de invocar mi código python, aparece un error:

ImportError: Ningún módulo llamado hello_ext.

Después de cambiar el nombre del hello.dll a hello.pyd o hello_ext.pyd, consigo otro ImportError: cargar la DLL no

¿Cómo puedo crear el archivo .pyd correcta utilizando VS 2008?

+0

Para aquellos interesados ​​en la construcción de un proyecto de este tipo con un makefile (y gcc), ver http://stackoverflow.com/questions/2003506/how-to-build-a-boost-dependent-project-using-regular-makefiles/2055958#2055958 – rafak

Respuesta

0

Por favor, asegúrese de que tiene el indicador -lpython26 (si está utilizando python2.6) y el nombre del archivo debe ser hello_ext.pyd en su caso.

10

En primer lugar, asegúrese de tratar de importar la versión de Python; la importación de la versión de depuración fallará porque las versiones de la biblioteca de tiempo de ejecución no coinciden. También me cambio de las propiedades del proyecto de manera que la versión de lanzamiento genera un archivo .pyd:

Propiedades >> >> Enlazador de salida:

$(OutDir)\$(ProjectName).pyd 

(que también se crea una acción posterior a la generación de ejecutar pruebas unitarias de pitón)

a continuación, asegúrese de definir lo siguiente en su archivo stdafx.h:

#define BOOST_PYTHON_STATIC_LIB 

por último, si tiene instalada más de una versión de Python, asegúrese de que usted es i mportar la versión correcta de python.h (en Herramientas >> Opciones >> Proyectos y soluciones >> Directorios VC++ >> Incluir archivos).

5

El error ImportError: cargar la DLL no por lo general significa que su módulo .pyd depende de otros archivos DLL que no se pudo encontrar - a menudo MSVC * .dll. Puede intentar abrir el archivo .pyd en el Bloc de notas y buscar ".dll". Luego verifique si todas las dependencias DLL existen en su directorio o PATH.

O utilice Dependency Walker que encontrará dependencias que faltan para que

1

A pesar de que esta es una pregunta emitida hace varios años (todavía no es fácil encontrar la solución), pero me encuentro con el mismo problema hoy en día, y después de horas de búsqueda, finalmente encontré una solución factible.

  • La razón es tan simple como que es observado por @AndiDog, el archivo .pyd a construir depende de alguna otra .dll;
  • En mi caso, es boost_python-vc120-mt-1_58.DLL bajo la carpeta [C++ carpeta impulso]/fase/lib/
  • Por lo tanto, lo que hago es copiar este archivo y pegarlo en la carpeta de archivos .pyd, y luego mi Python puede adecuadamente importar el proyecto que construyo

  • tal vez haya algunas otras soluciones, es decir, compile su proyecto, no dependa de la biblioteca dinámica, use la biblioteca estática en su lugar. algunas de las fuentes dicen que definen BOOST_PYTHON_STATIC_LIB en el preprocesador VS, entonces su proyecto no dependerá de la biblioteca dinámica (soy un nuevo C++ er), pero asegúrese de tener compilación libboost_python-vcXXX-mt-1_58.dll en impulso.

  • para definir preprocesador, la ruta es: C/C++ -> Preprocessor-> preprocesador Definiciones-> editar BOOST_PYTHON_STATIC_LIB
Cuestiones relacionadas