簡體   English   中英

使用Python Egg / Wheel打包共享對象(庫)

[英]Package shared object (library) with Python Egg / Wheel

到目前為止,我已經做到了:

  1. 使用以下內容創建MANIFEST.in include path/to/libfoo.so
  2. 創建的setup.py會在調用setupt.py installlibfoo.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的腳本,而rpathlibfoo.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM