c++ - boost Python 可移植性问题

标签 c++ python boost portability boost-python

我有一个用 C++ 编写的 dll,我想将其导出到 Python 以运行回归和单元测试(使用 Python 维护和运行回归更容易)。 为此,我想使用 Boost.Python 导出 dll 的主要 API,以便它可以在 Python 中使用。 我的程序集如下所示:

  1. MyLibrary.dll//主要API C++库
  2. MyLibrary.pyd//一个仅包含BOOST_PYTHON_MODULE导出定义的瘦dll项目(依赖于MyLibrary.dll)
  3. ...//MyLibrary.dll依赖的其他C++ dll文件

我在让 MyLibrary.pyd 链接时遇到了一些麻烦,但在深入研究了一些问题之后(例如 here)我意识到我必须重新构建 boost ,同时将 b2.exe 指向我的特定 python 版本。之后,我能够从 python 导入并运行我的库(在我的机器上)。

技术数据:我在 Windows 7 x64 和 MSVC-10.0 上使用 boost 1.51、Python 3.23 和 MSVC-10.0 构建库(我自己的项目是从 VS2010 构建的)。我用来与 boost 链接的变体是共享库,64 地址模型,相应地与我自己的构建一起发布。

问题是,当我尝试在另一台机器上导入库(在我的机器上构建)时,python 提示:

ImportError: DLL load failed: The specified procedure could not be found.

在线import MyLibrary

这引出了以下问题:

  1. 我在我的机器上构建的 MyLibrary.pyd 是“python-portable”吗?意思是,除了 3.23(我用来在我的机器上构建 boost.python 的版本)之外,它还能在其他版本的 Python 上运行吗?
  2. MyLibrary.pyd 的用户是否必须使用他自己的 python 版本重新构建 boost 才能成功导入它?
  3. 到目前为止,我们一直在使用由 BoostPro 提供的适用于 Windows 的预构建 boost 安装程序。构建链接的 Python 版本是什么?如果我们只是决定在整个团队中使用“正确”版本的 Python(BoostPro 链接的版本),我是否可以让我的用户免于自行构建 boost 的麻烦?<

最佳答案

http://docs.python.org/3.2/whatsnew/3.2.html 查看 PEP 384 .

http://www.boost.org/doc/libs/1_52_0/libs/python/doc/news.html表明最近没有任何实际进展,所以我怀疑 Boost.Python 是否支持或至少使用 Py_LIMITED_API 定义进行了测试。

根据我使用 Boost.Python 和 PyCXX 实现 Python 2.x 兼容性的经验(我还没有使用 3.x 系列):

  1. 不,不会。只有微版本更改才能保持 ABI 的可移植性。
  2. 不完全是。您提供的 MyLibrary.pyd 二进制文件的用户将无法使用不同的主要/次要 python 版本加载它。她拥有的 Boost 构建配置并不重要。您需要使用要支持的每个次要 Python 版本构建 Boost.Python。这包括针对 32 位和 64 位 Python 安装的单独构建。

我的建议是尝试从定义了 Py_LIMITED_API 的源代码构建 Boost。我不保证它会成功,但值得一试。

如果失败,要求你的队友使用与你相同的 Python 版本,当然还有 x64 位 Windows(因为 .pyd 本身是 64 位的)。或者甚至更好地设置一个 CI 机器,它将在每个必需的配置中构建你的 python 模块,以便你的客户能够选择合适的二进制文件。让您的团队成员构建和使用他们自己的 MyLibrary.pyd 版本,仅供本地使用。

关于c++ - boost Python 可移植性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13252598/

相关文章:

c++ - 从 C++ 中的函数返回指向数组的指针?

python - 删除函数更改不相关的 for 循环的元素 (Python)

python - 读取二进制数据并将数据分布在网格文件Python中

c++ - 从 boost mpl vector 注册类型

c++ - ReadFile() 返回空白数据

c++ - 试图让我的 C++ 代码编译,g++ 无法识别?

c++ - 在 C++ 中,fork 和 kill 不会杀死所有的子进程

python - 在 Numpy 中编写滑动中位数的有效方法是什么?

c++ - 无法使用 Boost.process

c++ - boost scoped_lock 互斥锁崩溃