我有一个用 C++ 编写的 dll,我想将其导出到 Python 以运行回归和单元测试(使用 Python 维护和运行回归更容易)。 为此,我想使用 Boost.Python 导出 dll 的主要 API,以便它可以在 Python 中使用。 我的程序集如下所示:
- MyLibrary.dll//主要API C++库
- MyLibrary.pyd//一个仅包含
BOOST_PYTHON_MODULE
导出定义的瘦dll项目(依赖于MyLibrary.dll) - ...//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
这引出了以下问题:
- 我在我的机器上构建的 MyLibrary.pyd 是“python-portable”吗?意思是,除了 3.23(我用来在我的机器上构建 boost.python 的版本)之外,它还能在其他版本的 Python 上运行吗?
- MyLibrary.pyd 的用户是否必须使用他自己的 python 版本重新构建 boost 才能成功导入它?
- 到目前为止,我们一直在使用由 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 系列):
- 不,不会。只有微版本更改才能保持 ABI 的可移植性。
- 不完全是。您提供的 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/