2010-11-04 19 views
5

No puedo reproducir el ejemplo básico de SWIG en Windows. Mi error se indica en los documentos de SWIG y estoy seguro de que hago las 2 correcciones que mencionan. Para este error:swig no module named _example

>>> import example 
Traceback (most recent call last): 
    File "<stdin>", line 1, in ? 
    File "example.py", line 2, in ? 
    import _example 
ImportError: No module named _example 

la documentación TRAGO establece claramente:

olvidar el subrayado inicial (_). .

olvidar el subrayado inicial (_)> Si recibe este mensaje, significa que

you either forgot to compile the wrapper code into an extension module or you didn't give the extension module the right name. Make sure that you compiled the wrappers into a module called example.so. And don't forget the leading underscore ().forget the leading underscore (_).

y estoy seguro de que me enlace con la última composición de objetos envoltura y he tryied: "_example" , "_example.so", "example.dll", "example.so", "example.dll", incluso todos a la vez, y que el "example.py" generado está en la misma carpeta que la biblioteca compartida, y que la ruta de Python contiene este directorio para olvidar el subrayado inicial ().

EL EJEMPLO:

//example.h 
int foo_sum(int a, int b); 

.

//example.cpp 
int foo_sum(int a, int b) { 
    return a + b; 
} 

.

//example.i 
%module example 
%{ 
#include "example.h" 
%} 

#include "example.h 

y la construcción comandos:

gcc -IV:\temp\example\external\include\Python -O3 -Wall -c -fmessage-length=0 -oexample_wrap.o ..\example_wrap.c 
g++ -IV:\temp\example\external\include\Python -O3 -Wall -c -fmessage-length=0 -oexample.o ..\example.cpp 
g++ -LV:\temp\example\external\lib -shared -oexample.dll example_wrap.o example.o -lpython26 

incluso si no uso -O3 todavía no funciona (Pegué los comandos de construcción de una configuración Release)

I también intentado esto y ningún éxito:

>>> import sys 
>>> sys.path.append("/your/module/path") 
>>> import example 

EDIT:

parecer que carga la DLL si cambia el nombre a "_example.pyd", pero el módulo cargado no contiene mi función "foo_sum"

EDIT: funciona ahora, estoy usando extern "C" y sin incluir encabezados en el archivo .i

+11

Debe escribir su respuesta en una respuesta y marcarla como correcta (obtiene una insignia de autoaprendizaje). Impide que personas como yo busquen tu pregunta en la lista sin respuesta solo para descubrir que todo está bien. – Tom

Respuesta

0

Encontré que debe cambiar el nombre del archivo de biblioteca que C++ genera de .dll a .pyd en Windows. No recuerdo si necesitas cambiar el nombre en Apple. y su función que desea exponer a python debe tener una "C" externa precediéndola. De lo contrario, el compilador no hace que la función sea accesible fuera de la biblioteca. Además, si recuerdo, debe ajustar los valores devueltos en un Py_value si desea usarlos en Python.

2

El nombre de archivo de la biblioteca debe ser * .pyd. Supongo que ha generado un código de envoltura y lo ha unido.

0

Encontré que (en Windows), si hace un dll tiene que llamarse _modulename.pyd Esta biblioteca (_modulename.pyd), el módulo C++ original myapp.dll y el modulename.py resultante tienen que ser en la ruta, así como en pythonxx.exe