2012-11-06 84 views
4

我有一個用C++編寫的dll,我想要導出到Python以運行迴歸和單元測試(它只是更容易維護並使用Python運行迴歸)。 爲此,我想使用Boost.Python來導出dll的主API,以便它可以在Python中使用。 我的組件如下所示:提升Python可移植性問題

  1. MyLibrary.dll //主API C++庫
  2. MyLibrary.pyd //僅含有BOOST_PYTHON_MODULE導出定義的薄dll項目(取決於MyLibrary.dll)
  3. ... //其它C++ DLL文件MyLibrary.dll取決於

我遇到了一些麻煩MyLibrary.pyd鏈接,而是通過挖掘問題後位(例如here)我意識到我必須重新建立提升而點球ng b2.exe到我的特定Python版本。之後,我能夠從python導入並運行我的庫(在我的機器上只有)。技術數據:我使用boost 1.51,Windows 7 x64上的Python 3.23和MSVC-10.0(我自己的項目是從VS2010構建的)構建庫。我用來鏈接boost的變體是共享庫,64位地址模型,相應地用我自己的版本發佈。

問題是,當我嘗試導入庫中另一臺機器上(內置在我的機器上),蟒蛇抱怨:

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提供的預先構建的boost安裝程序。如果我們只是決定在整個團隊中使用「正確」的Python版本(BoostPro鏈接的版本),我可以爲我的用戶節省建立提升的麻煩嗎?
+1

您是否使用過Dependency Walker來調查MyLibrary.pyd的依賴關係? –

+0

@JanneKarila:我對Dependency Walker不熟悉。你能擴展嗎? – eladidan

+0

也許有一個depends.exe已經在你的Visual Studio中,否則請參閱http://www.dependencywalker.com/ –

回答

3

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

http://www.boost.org/doc/libs/1_52_0/libs/python/doc/news.html顯示最近沒有任何真正的進展,所以我懷疑Boost.Python是否支持或者至少已經用定義的Py_LIMITED_API進行了測試。

根據我的使用既Boost.Python的和PyCXX(我還沒有和3.X線工作尚未)的Python 2.x的兼容性體驗:

  1. 沒有也不會。只有微版本更改才能保持ABI便攜性。
  2. 不完全。您提供的MyLibrary.pyd二進制文件的用戶將無法使用不同的主要/次要Python版本加載它。她的Boost構建配置並不重要。你需要有提升。Python會隨您希望支持的每個小型Python版本一起構建。這包括32位和64位Python安裝的單獨構建。

我的建議是嘗試從定義了Py_LIMITED_API的源代碼構建Boost。我不保證它會成功,但是值得一試。

如果失敗,請求你的隊友使用與你一樣的Python版本,當然還有一個x64位的Windows(因爲.pyd本身就是64位)。或者甚至更好地設置CI機器,它將在每個必需的配置中構建您的python模塊,以便您的客戶能夠選擇合適的二進制文件。讓你的隊友建立和使用他們自己的MyLibrary.pyd版本,僅用於本地使用。