2013-09-10 59 views
2

所以我創建了兩個模塊::蟒:使用升壓導入相關的Python庫從升壓蟒蛇

BOOST_PYTHON_MODULE(A) { ... } 
BOOST_PYTHON_MODULE(B) { ... } 

,使得B依賴於A.然後我嘗試使用Python代碼來調用它們:

import sys 
sys.path.append('path/to/modules/') 

import A 
import B 

... # python body 

最後我所說的python腳本從終端:

python path/to/python/script.py 

這隻要我EXECUT完美的作品e從我安裝boost :: python模塊的目錄中執行終端命令。但是,如果我把它從任何其他目錄中我得到的錯誤

File "path/to/python/script.py", line 6, in <module> 
    import B 
importError: dlopen(path/to/B.so, 2): Library not loaded: A.so 
Referenced from: path/to/B.so 
Reason: image not found 

注意,它失敗的「進口B」所以sys.path.append命令它引導到正確的位置。由於某些原因,boost :: python庫不在sys.path目錄中查找?有沒有辦法設置它?我試圖在boost python中添加路徑,但這似乎只在庫的編譯時纔會產生影響,而不是在運行python。

有誰知道該怎麼辦?

謝謝!

+0

你爲什麼要dlopen lib?您可以在編譯時設置依賴項 – balki

+0

@balki:'dlopen'是'import'行爲的一部分。如果沒有在解釋器中靜態鏈接擴展,解釋器將如何加載C++庫? –

回答

2

如果B.so針對A.so的鏈接,則當加載B.so時,A.so需要位於動態鏈接器使用的路徑中。例如,在導入模塊B之前,將包含A.so的路徑添加到LD_LIBRARY_PATH環境變量中。

庫和模塊之間存在區別。 A.so是一個庫,而不是一個模塊。當試圖導入模塊時,Python最終可能會嘗試加載庫,要求庫初始化一個模塊。在這種情況下,庫A.so在由Python解釋器加載時初始化模塊Asys.path的文檔聲明它指定模塊的搜索路徑。因此,import B將發現B.so作爲importsys.path行爲的一部分。但是,當動態鏈接程序加載B.so時,動態鏈接程序(而不是Python解釋程序)需要分辨率爲A.so

想要了解加載庫時檢查的路徑的更多信息,請參考動態鏈接器的manual