繁体   English   中英

导入Swig生成的包装器时Python挂起

[英]Python Hangs When Importing Swig Generated Wrapper

当我尝试将c ++共享库导入到python 2.5的windows版本时,Python正在“悬挂”,我不知道为什么。

在Linux上,一切正常。 我们可以编译所有的C ++代码,生成swig包装类。 它们编译并可以在python 2.5或2.6中导入和使用。 现在,我们正在尝试使用Cygwin将代码移植到Windows。

我们可以使用-mno-cygwin将每个C ++库编译为共享dll,从而消除对cygwin1.dll的依赖。 从本质上讲,这会导致gcc目标为MinGW而不是Cygwin,从而使得生成的二进制文件可以在Windows中运行而不依赖于Cygwin。 而且,每个共享库都可以链接到c ++二进制文件并成功运行。

完成此操作后,我们使用swig为每个共享库生成包装器。 生成,编译和链接这些包装器没有问题。

接下来的步骤是将生成的python包装器导入python。 我们能够导入除了两个库以外的所有库。 对于两个不起作用的,当我们尝试将.py或.pyd文件导入Windows python(使用Visual C ++编译的版本)时,python会挂起。 我们不能用ctrl + c或ctrl + d杀死python,唯一的办法是通过任务管理器杀死它。 如果我们将gdb附加到python进程并打印堆栈跟踪,我们通常会得到垃圾,没什么用处。

接下来,我们尝试ifdef出* .i文件中的代码块并重新创建swig包装器。 这个过程至少允许我将库导入到Windows python中,但问题是我们必须注释掉运行软件所需的太多函数。 通常,有三种类型的函数必须被注释掉:静态函数,虚拟const函数和未声明为const的常规公共函数。 这也是可重现的,如果我们取消注释这些函数中的任何一个,那么导入将再次挂起。

接下来,我们尝试将函数提取到一个简单的hello world程序中,生成一个swig包装器并将它们导入到python中。 这很有效。 我们完全从头文件中复制了函数。 它们在非常小的测试程序中工作,但不在较大的共享库中。 我们正在以完全相同的方式构建它们。

因此,任何关于为什么会发生这种情况的想法,甚至只是更好的调试技术都会非常有帮助。

这些在使用gcc 3和4以及python 2.5和2.6的Linux上运行良好。 在Windows上,这是我正在使用的软件:gcc 3.4.4 swig 1.39(来自swig.org的Windows二进制文件)python 2.5.4(Windows二进制文件和来自python.org的/ libs)

这些是我用来构建简单的hello world程序的命令(完整的库使用相同的选项,因为额外的-I,-L和-l选项,它只是更长的时间)

swig -c ++ -python -o test_wrap.cc test.i

gcc -c -mno-cygwin test.cc

gcc -c -mno-cygwin test_wrap.cc -I / usr / python25 / include

dlltool --export-all --output-def _test.def test.o

gcc -mno-cygwin -shared -s test_wrap.o test.o -L / usr / python25 / libs -lpython25 -lstdc ++ -o _TestModule.pyd

谢谢,AJ

我使用的一种技术是在模块init函数中插入一个“硬”断点( __asm int 3 )。 然后通过调试器运行它或者只运行它,并在调用中断时弹出Windows调试器。

你可以在这里下载一个很好的Windows调试器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM