[英]Package shared object (library) with Python Egg / Wheel
到目前為止,我已經做到了:
MANIFEST.in
include path/to/libfoo.so
setup.py
會在調用setupt.py install
將libfoo.so
放入/usr/local/lib/python/site-packages/foo.egg/path/to/libfoo.so
。 當然,這在運行時需要Python時無法幫助Python查找libfoo
。 我需要怎么做才能使Python真正找到該庫?
該庫沒有Python綁定,它只是其中包含一些本機代碼的共享庫。 從位於/usr/local/lib/python/site-packages/foo.egg/path/wrapped.cpython-36m-x86_64-linux-gnu.so
另一個共享庫中調用它。
如果要對共享庫的位置進行硬編碼,則可以使用rpath
選項。 為此,您會做類似的事情。
python setup.py build_ext --rpath=/usr/local/lib/python/site-packages/foo.egg/path/to
上面的setup.py是用於構建wrapped.cpython-36m-x86_64-linux-gnu.so
的腳本,而rpath
是libfoo.so
的路徑。因此,您當然應該可以將其直接放在構建腳本中,取決於該過程是什么樣的。
-rpath = DIR
將目錄添加到運行時庫搜索路徑。 在將ELF可執行文件與共享庫鏈接時使用。 所有-rpath參數都被串聯並傳遞到運行時鏈接程序,該鏈接程序使用它們在運行時定位共享對象。 在查找鏈接中顯式包含的共享庫所需的共享庫時,也使用-rpath選項
如果不是更新wrapped.cpython-36m-x86_64-linux-gnu.so
的構建過程的選項, wrapped.cpython-36m-x86_64-linux-gnu.so
我認為您唯一的選擇是將libfoo.so
放在加載庫路徑中的某個位置,或者在運行時手動添加位置時間。
在回答您的一些后續問題時...
系統裝入庫的位置來自/etc/ld.so.conf
並引用ld.so.conf.d
目錄中的位置。 ldconfig
命令從該數據重建共享庫的高速緩存,因此,如果您進行更改,請務必調用此命令。
在命令行或.bashrc
,可以使用export LD_LIBRARY_PATH=....
將其他目錄添加到搜索路徑。
您可以手動加載共享庫。 請參閱https://docs.python.org/2/library/ctypes.html 加載共享庫 。
我自己還沒有嘗試過,但我讀過,如果您在python代碼中手動加載下級共享庫,然后導入更高級別的庫,則鏈接器將不必走出去找到較低的鏈接器,因為它已經存在加載。 看起來像...
import ctypes
foolib = ctypes.CDLL('/full/path/to/libfoo.so')
import wrapped
StackOverflow上有許多有關如何執行此操作的示例,以及有關操縱庫搜索路徑的許多其他信息/示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.