Проблема с SWIG для создания привязок Python для библиотеки C - PullRequest
1 голос
/ 29 мая 2019

Я хочу использовать SWIG для создания привязок Python для библиотеки C, но у меня есть некоторые проблемы с этим.Я использовал следующие .c и .i файлы из учебника.example.c

/* Compute factorial of n */
int fact(int n) {
  if (n <= 1)
    return 1;
  else
    return n*fact(n-1);
}

/* Compute n mod m */
int my_mod(int n, int m) {
  return(n % m);
}

double My_variable;

example.i

%module example
%{
extern double My_variable;
extern int    fact(int);
extern int    my_mod(int n, int m);
%}

extern double My_variable;
extern int    fact(int);
extern int    my_mod(int n, int m);

Команды, которые я использовал:

$ swig -python -py3 example.i
$ gcc -c -fpic example.c example_wrap.c -I/usr/include/python3.6
$ gcc -shared example.o example_wrap.o -o example.so

И когда я пытаюсь импортировать его в python3, я получаюэто

>>> import example
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dynamic module does not define module export function (PyInit_example)

Любая помощь приветствуется

1 Ответ

1 голос
/ 29 мая 2019

SWIG генерирует модуль с подчеркиванием по умолчанию с добавлением подчеркивания , поэтому вы получите модуль с именем _example, который должен быть в _example.so.

Это объясняется в Документация SWIG 34.2.3 Ручная компиляция динамического модуля :

Хотя предпочтительным подходом к созданию модуля расширения является использование distutils, некоторым людям нравится интегрировать расширения здания сбольшая система сборки, и, следовательно, может захотеть собрать свои модули без distutils.Чтобы сделать это, вам нужно скомпилировать вашу программу, используя такие команды (как показано для Linux):

$ swig -python example.i
$ gcc -O2 -fPIC -c example.c
$ gcc -O2 -fPIC -c example_wrap.c -I/usr/local/include/python2.5
$ gcc -shared example.o example_wrap.o -o _example.so

Точные команды для этого варьируются от платформы к платформе.Тем не менее, SWIG пытается угадать правильные параметры, когда он установлен.Поэтому вы можете начать с одного из примеров в каталоге SWIG / examples / python.Если это не сработает, вам нужно прочитать man-страницы для вашего компилятора и компоновщика, чтобы получить правильный набор опций.Вы также можете проверить SWIG Wiki для получения дополнительной информации.

При связывании модуля имя выходного файла должно совпадать с именем модуля с префиксом подчеркивания.Если имя вашего модуля example, то имя соответствующего объектного файла должно быть _example.so или _examplemodule.so.Имя модуля указывается с использованием директивы% module или параметра командной строки -module.

Примечание по совместимости: в SWIG-1.3.13 и более ранних выпусках имена модулей не включали в себя нижнее подчеркивание,Это связано с тем, что модули обычно создавались как расширения C-only без дополнительного файла поддержки Python (вместо этого создание кода Python поддерживалось как дополнительная функция).Это было изменено в SWIG-1.3.14 и согласуется с другими модулями расширения Python.Например, модуль сокета фактически состоит из двух файлов;socket.py и _socket.so.Многие другие встроенные модули Python придерживаются аналогичного соглашения.

...