Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swig/python:何时需要Swig_init()?_Python_C++_Swig - Fatal编程技术网

Swig/python:何时需要Swig_init()?

Swig/python:何时需要Swig_init()?,python,c++,swig,Python,C++,Swig,大家好,谢谢你们帮助我 我在尝试导入swig生成的python模块时遇到了问题。 我有一个包含几个方法的基本库“示例”。 在它旁边,我有一个动态链接到python的主程序。 此程序导入生成的模块并调用其中的函数 如果我的库示例是一个名为_example.so的共享示例,那么一切工作都很完美,我可以用python导入它 但是如果我的库是静态的,_example.a,并且链接到主程序,那么我将出现错误“找不到名为_example的模块”,除非我在主函数中添加对SWIG_init()的调用 SWIG_

大家好,谢谢你们帮助我

我在尝试导入swig生成的python模块时遇到了问题。 我有一个包含几个方法的基本库“示例”。 在它旁边,我有一个动态链接到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)");
}

您调用的是本地python模块的init函数,该模块由SWIG生成的python包装器加载。对于Python2,该函数被命名为
init\u example
,用于

每个模块都需要这样一个函数,它基本上初始化所有模块,并注册模块的名称和所有可用的方法。在您的情况下,SWIG为您生成了此函数

当静态编译库时,您必须自己调用此函数的原因很简单,就是python包装器示例导入了本机模块示例,根据python约定,本机模块示例是一个共享对象,您没有编译它,因此找不到它

通过调用SWIG_init,您可以“预加载”模块,这样python就不会尝试重新导入它,所以即使python模块路径上没有任何共享对象,它也可以工作


如果您有模块的共享对象,python将在加载共享对象后为您调用此函数,您不必为此担心。

非常感谢!我不太清楚,在不重建解释器的情况下,是否可以将静态库用作模块。现在我明白为什么要打这个电话了。再次感谢!
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