2017-05-24 46 views
0

我試圖按照說明here來使用Boost.Python。源代碼在該網頁中。我可以編譯,鏈接這個簡單的示例代碼,但是我不能在python命令行中導入生成的模塊。它總是錯誤:由Boost.Python創建的dll無法導入(下面是Boost Python的快速入門)

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named hello_ext 

我不知道問題出在哪兒,因爲該網頁只是說:。「就這樣,我們就大功告成了現在,我們可以建立這個作爲一個共享庫生成的DLL現在是可見到Python「。這是我的建築環境:

  • 的Windows 7 64位,我是管理員和運行CMD作爲管理員
  • 增壓版本1.64.0(預編譯的二進制boost_1_64_0-MSVC-14.0-64.exe從here下載)
  • Python版本是2.7.13,64位
  • 的Visual Studio 2015年更新3
  • 目標是一個DLL
  • 項目名稱是ConsoleApplication1,所以輸出ConsoleApplication1.dll。我已將文件名更改爲hello_ext.dll,但出現同樣的錯誤。
  • 我用x64配置構建,我用dumpbin驗證過輸出ConsoleApplication1.dll真的是64位
  • 我已經將包含ConsoleApplication1.dll的路徑...... \ ConsoleApplication1 \ x64 \ Release添加到python命令行中的sys.path。

那麼,你能告訴我如何在python中導入模塊嗎?非常感謝。

+0

保存所有這些麻煩,並獲取[Visual Studio的預構建二進制文件](https://sourceforge.net/projects/boost/files/boost-binaries/1.64.0/) – PaulMcKenzie

+0

錯誤:「無法解析的外部符號__imp_PyString_Type「在x64配置。在x32 config中出現錯誤LNK2001:無法解析的外部符號「__declspec(dllimport)...」錯誤 – user5280911

+0

以'__imp_'開頭的那些錯誤表明您沒有在鏈接器設置中指定相應的導入庫「.lib」文件。我在你的描述中沒有看到任何內容,說明你已經告訴鏈接器將使用哪些導入庫或庫的名稱。設置路徑不會這樣做,並且DLL在構建過程中不起作用 - 它們僅在運行時使用。預構建的二進制文件包括導入庫(與大小爲兆字節的靜態庫相反,不是很大的.lib文件)。 – PaulMcKenzie

回答

1

我自己解決了這個問題。感謝jagerman提供了有用的建議。 (1)只要將輸出文件名從ConsoleApplication1.dll更改爲hello_ext.pyd即可。您可以通過將Pages-> General-> Target Extension設置爲「.pyd」來自動執行此重命名。確保文件hello_ext.pyd在python的搜索路徑中。你可以把它放到C:\ Python27 \ DLL中,這是Python內置的搜索路徑之一。

(2)現在您將得到一個不同的導入錯誤:DLL加載失敗:指定的模塊找不到。如果仔細觀察hello_ext.pyd的文件大小,您可能會注意到一些有線連接 - 它只有19KB。這意味着它不包含所有需要導入python的東西,所以python必須找到缺少的部分來正確導入它。是的,你可能會猜到 - 唯一可能丟失的東西是Boost.Python庫,所以將其路徑添加到PATH環境變量中 - 對我來說,它是C:\ local \ boost_1_64_0 \ lib64-msvc-14.0。

然後問題就解決了。注意:在其他相關問題中的一些答案可能會建議構建爲靜態庫。這樣,您將得到另一個導入錯誤:DLL加載失敗:%1不是有效的Win32應用程序。所以只需構建爲DLL。 PS:你不需要在Property Pages-> Linker-> Input-> Additional Dependencies中指定boost_python-vc140-mt-1_64.lib或boost_python-vc140-mt-gd-1_64.lib,因爲建議了一些註釋。