gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 18:55:58 24 4
gpt4 key购买 nike

当我尝试将 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'ing 出 *.i 文件中的代码块并重新创建 swig 包装器。这个过程至少允许我将库导入 Windows python,但问题是我们不得不注释掉太多软件运行所必需的函数。通常,必须注释掉三种类型的函数:静态函数、虚拟 const 函数和未声明为 const 的常规公共(public)函数。这也是可重现的,如果我们取消注释这些函数中的任何一个,那么导入会再次挂起。

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

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

这些在使用 gcc 3 和 4 以及 python 2.5 和 2.6 的 Linux 上运行良好。在 Windows 上,这是我正在使用的软件: 海湾合作委员会 3.4.4 swig 1.39(来自 swig.org 的 Windows 二进制文件) python 2.5.4(Windows 二进制文件和包含来自 python.org 的库)

这些是我用来构建简单的 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

谢谢,阿杰

最佳答案

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

您可以从 Microsoft 下载一个不错的 Windows 调试器 here .

关于导入 Swig 生成的包装器时 Python 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1162461/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com