过去几天,我一直在努力导入SWIG生成的模块。我使用Python 3.4.1和SWIG 3.0.5。
我已按如下方式设置我的界面API.i文件:
%module Root
%{
#include "Root.h"
%}
%include "Root.h"
标题中没有什么花哨的东西,因为我只是试图让事情顺利进行。生成API_wrap.cxx
文件,Root.py
文件也是如此。到目前为止一切都很好。
现在,基于以下站点:https://docs.python.org/2/faq/windows.html#how-can-i-embed-python-into-a-windows-application他们暗示我可以通过执行以下操作直接加载模块(所有在同一个EXE中,无需单独的DLL):
Py_Initialize();
PyInit__Root();
PyRun_SimpleString("import Root");
如果我还没有Root.py文件,导入工作正常,但后来我丢失了影子/代理类(除此之外,我还在猜测)。如果我有Root.py文件,我会收到以下错误:
"导入无法找到模块,或者无法在模块中找到名称。"
我注意到如果我在Root.py文件中写入乱码,我会收到语法错误,这很明显生成的Root.py存在问题。我想有某种设置我做错了,但如果有人有任何建议,我们将不胜感激!
答案 0 :(得分:0)
我认为您希望使用PyImport_AppendInittab
正确注册内置模块。
您还要调用PySys_SetPath()
来设置模块本身的Python代理部分的路径。
我为你准备了一个完整的例子。使用SWIG模块:
%module test
%inline %{
void doit(void) {
printf("Hello world\n");
}
%}
我们可以使用以下方法单独编译和验证:
swig2.0 -Wall -python test.i
gcc -Wall -Wextra -shared -o _test.so test_wrap.c -I/usr/include/python2.7
Python 2.7.6 (default, Mar 22 2014, 22:59:38)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> test.doit()
Hello world
然后我们可以编写我们的C代码来嵌入Python。 (我用我的答案to this question作为参考点)。我的C测试是:
#include <Python.h>
void init_test(void);
int main() {
PyImport_AppendInittab("_test", init_test); // Register the linked in module
Py_Initialize();
PySys_SetPath("."); // Make sure we can find test.py still
PyRun_SimpleString("print 'Hello from Python'");
PyRun_SimpleString("import test");
PyRun_SimpleString("test.doit()");
return 0;
}
这在编译和运行时起作用:
swig2.0 -Wall -python test.i
gcc -Wall -Wextra -shared -c -o test_wrap.o test_wrap.c -I/usr/include/python2.7
gcc run.c test_wrap.o -o run -Wall -Wextra -I/usr/include/python2.7 -lpython2.7
./run
Hello from Python
Hello world
如果我跳过设置路径或AppendInittab调用它并没有像我希望的那样工作。