2010-11-04 14 views
5

Nie mogę odtworzyć podstawowego przykładu SWIG w oknach. Mój błąd jest podany w dokumentach SWIG i jestem pewien, że robię 2 poprawki, o których wspominają. Z tego błędu:swig no module o nazwie _przykład

>>> 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 

dokumentacja SWIG wyraźnie stwierdza:

zapomnieć wiodącą podkreślenia (_). .

zapomnieć wiodącą podkreślenia (_)> Jeśli pojawi się ten komunikat, oznacza to, że

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 (_).

i jestem pewien, że mogę połączyć z najnowszej kompilacji obiektu okład i ja tryied: „_example” , "_example.so", "example.dll", "example.so", "example.dll", nawet wszystkie naraz, oraz że wygenerowany "example.py" znajduje się w tym samym folderze co biblioteka współdzielona, i że ścieżka Pythona zawiera ten katalog, aby znaleźć wiodący znak podkreślenia ().

PRZYKŁAD:

//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 

i kompilacji komendy:

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 

nawet jeśli nie używam opcja -O3 to nadal nie działa (I wklejony kompilacja poleceń z konfiguracji release)

I próbowałem też i bez powodzenia:

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

EDIT:

najwyraźniej ładuje dll jeśli przemianować go na „_example.pyd”, ale załadowany moduł nie zawiera moja funkcja „foo_sum”

EDIT: działa teraz używam extern „C” i nie włączając nagłówków w pliku .i

+11

Powinieneś zapisać swoją odpowiedź w odpowiedzi i oznaczyć ją jako poprawną - (otrzymujesz odznakę samouczka). To powstrzymuje ludzi takich jak ja, szukających twojego pytania na liście bez odpowiedzi, tylko po to, aby wszystko było w porządku. – Tom

Odpowiedz

0

Znalazłem, że musisz zmienić nazwę pliku biblioteki, który C++ generuje od .dll do .pyd w systemie Windows. Nie pamiętam, czy musisz zmienić nazwę na jabłko. a twoja funkcja, którą chcesz eksponować na pythona, musi mieć poprzedzający ją "C". W przeciwnym razie kompilator nie udostępnia funkcji poza biblioteką. Również jeśli przypominam, musisz zawijać wartości zwracane w wartości Py_, jeśli chcesz ich użyć w pythonie.

2

Nazwa pliku biblioteki musi wynosić * .pyd. Przypuszczam, że wygenerowałeś kod opakowania i łączysz go ze sobą.

0

Znalazłem (w oknach), jeśli stworzysz bibliotekę dll, musisz ją nazwać _modulename.pyd Ta biblioteka (_modulename.pyd), oryginalny moduł myapp.dll C++ i wynikowy modulename.py muszą być na ścieżce, a także pythonxx.exe

Powiązane problemy