Привет всем и спасибо за попытку помочь мне!
Я сталкиваюсь с проблемой при попытке импортировать модуль python, сгенерированный swig.
У меня есть базовый «пример» библиотеки, содержащий несколько методов.
Рядом с ним у меня есть основная программа, динамически связанная с Python.
Эта программа импортирует сгенерированный модуль и вызывает в нем функцию.
Если мой пример библиотеки является общим, с именем _example.so, все работает отлично, и я могу импортировать его в python.
Но если моя библиотека статическая, _example.a и связана с основной программой, у меня будет ошибка "модуль с именем _example не найден", если я не добавлю вызов SWIG_init () в основную функцию.
Что именно делает SWIG_init () и когда мне его использовать? Мне это кажется довольно странным, потому что в документации никогда не говорится, чтобы сделать такой вызов.
Я знаю, что работать с разделяемой библиотекой .so лучше, но я пытаюсь воспроизвести поведение того, что имею в работе над большим проектом, поэтому мне действительно нужно понять, что происходит, когда модуль статичен.
Вот мой основной файл:
#include "Python.h"
#include <iostream>
#if PY_VERSION_HEX >= 0x03000000
# define SWIG_init PyInit__example
#else
# define SWIG_init init_example
#endif
#ifdef __cplusplus
extern "C"
#endif
#if PY_VERSION_HEX >= 0x03000000
PyObject*
#else
void
#endif
SWIG_init(void);
int main (int arc, char** argv)
{
Py_Initialize();
SWIG_init(); // needed only using the statically linked version of example ?
PyRun_SimpleString("print \"Hello world from Python !\"");
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append(\"/path/to/my/module\")");
PyRun_SimpleString("import example");
PyRun_SimpleString("a = example.Example()");
PyRun_SimpleString("print a.fact(5)");
}
Вот как все это генерируется:
swig -c++ -python example.i
g++ -fpic -c example.cpp example_wrap.cxx -I/include/python2.7 -lstdc++
ar rvs libexample.a example.o example_wrap.o
// to generate dynamic instead of static : g++ -shared example.o example_wrap.o -o _example.so
g++ main.cpp -I/include/python2.7 libexample.a -lstdc++ -L/lib/python -lpython2.7 -o main