编译的Python库在一台电脑上正常,但另一台不行

0 投票
3 回答
539 浏览
提问于 2025-04-17 00:06

我写了一个Python接口来调用C++代码。我有两台运行Ubuntu 11.04的电脑,叫它们A和B,它们安装了相同的软件包(Python 2.7.1,NumPy 1.5.1,GCC 4.5.2)。

这段代码在两台电脑上都能顺利编译和链接,没有错误。但是在A电脑上,代码在C++代码的某个地方似乎进入了无限循环(CPU在工作,但程序就是不结束)。如果我把这个共享库复制到B电脑上,它就能正常工作,没有任何问题。

我可以通过对代码做一些小改动、使用不同的参数等来重现这个问题。我用过valgrind工具,但没有发现内存泄漏或者访问未分配的内存等问题。代码只依赖于包管理系统安装的库,所以这些库是完全相同的。

有没有人能给出一个合理的解释,为什么会出现这样的情况?除了以下几点(我已经检查过):

  • A和B运行的所有库/软件包都是一样的
  • 底层的C++库没有外部依赖,除了boost::function和STL
  • 所有代码都是用相同的构建系统/编译器从头开始干净地编译的
  • 环境变量也是一样的

3 个回答

0

你知道吗,构建你电脑上的Python时用了哪个编译器吗?这个问题很重要,特别是对于Python的扩展功能。如果你使用了不同的编译器,可能会出现一些意想不到的问题。

0

即使你没有使用多线程(比如没有定义多个线程),也可能会遇到一个叫做SMP的问题:如果某个内存位置是易变的,程序在切换上下文和CPU调度时,可能会导致它“看不到”实际的变化。

  • 你有没有尝试过在编译时不使用任何优化选项(在gcc中使用-O0)?
  • 有没有一些变量可能是易变的,应该标记为易变的?(比如设备输入、零拷贝缓冲区、内存映射等)。

即使你没有(明确地)使用多线程,我也不会感到惊讶,如果Python的垃圾回收是在一个单独的线程中运行的话。

0

不同的电脑可能有不同的处理器和架构。理想情况下,你应该在另一台电脑上也编译一下Python。这样你就能知道问题是出在复制库文件上,还是你的代码有问题,或者是环境配置的问题。

撰写回答