增加了Python的可移植性问题

时间:2012-11-06 13:58:26

标签: 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文件
  4. 我在使用MyLibrary.pyd进行链接时遇到了一些麻烦,但在仔细研究了一些问题之后(例如here)我意识到我必须重新构建boost,同时将b2.exe指向我特定的Python版本。之后我能够从python导入并运行我的库(在我的机器上)。

    技术数据:我正在使用boost 1.51构建库,在Windows 7 x64和MSVC-10.0上构建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版本(BoostPro链接的版本),那么我可以将自己的构建链接到哪个版本的Python,并且可以让我的用户免于自己构建boost的头痛?

1 个答案:

答案 0 :(得分: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安装的单独构建。
  3. 我的建议是尝试使用定义的Py_LIMITED_API从源代码构建Boost。我不保证它会成功,但值得一试。

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