swig нет модуля с именем _example - PullRequest
7 голосов
/ 04 ноября 2010

Я не могу воспроизвести основной пример SWIG для Windows.Моя ошибка указана в документации SWIG, и я уверен, что я делаю 2 исправления, которые они упоминают.Для этой ошибки:

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

документация SWIG четко гласит:

забудьте начальное подчеркивание (_).

забудьте начальное подчеркивание (_).> Если выполучить это сообщение, это означает, что

вы либо забыли скомпилировать код оболочки в модуль расширения, либо не дали модулю расширения правильное имя.Убедитесь, что вы скомпилировали оболочки в модуль с именем example.so.И не забывайте начальное подчеркивание (). Забудьте начальное подчеркивание (_).

, и я уверен, что я свяжусь с последней сборкой объекта переноса, и я попытался: "_example "," _example.so "," example.dll "," example.so "," example.dll ", даже все сразу, и что сгенерированный" example.py "находится в той же папке, что иразделяемая библиотека, и то, что путь python содержит этот каталог, забывает начальное подчеркивание ().

ПРИМЕР:

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

и команды сборки:

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

, даже если я не использую -O3, он все равно не работает (я вставил команды сборки из конфигурации выпуска)

Я тоже пробовал это и безуспешно:

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

РЕДАКТИРОВАТЬ:

очевидно, он загружает DLL, если вы переименуете его в "_example.pyd", НО модульЗагруженный не содержит мою функцию "foo_sum"

РЕДАКТИРОВАТЬ: она работает сейчас, я использую extern "C" и не включаю заголовки в файл .i

Ответы [ 3 ]

3 голосов
/ 17 января 2012

Имя файла библиотеки должно быть * .pyd. Я полагаю, что вы сгенерировали код оболочки и связали его вместе.

1 голос
/ 10 марта 2011

Я обнаружил, что вам нужно переименовать файл библиотеки, создаваемый C ++, из .dll в .pyd в Windows. Я не могу вспомнить, если вам нужно переименовать его на яблоко. и вашей функции, которую вы хотите представить в python, должен предшествовать внешний символ "C". В противном случае компилятор не делает функцию доступной за пределами библиотеки. Также, если я напомню, вам нужно обернуть возвращаемые значения в Py_value, если вы хотите использовать их в python.

0 голосов
/ 15 ноября 2017

Я обнаружил, что (в Windows), если вы делаете dll, он должен называться _modulename.pydпуть, а также pythonxx.exe

...