4

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

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

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

技术数据:我在 Windows 7 x64 和 MSVC-10.0 上使用 boost 1.51、Python 3.23 构建库(我自己的项目是从 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 的麻烦?
4

1 回答 1

3

在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 版本,仅供本地使用。

于 2012-11-06T23:41:25.983 回答