簡體   English   中英

如何在python輪包中包含外部庫

[英]How to include external library with python wheel package

我想為 python 創建包,該包在 Linux 上使用 cffi 模塊嵌入和使用外部庫 ( .so )。

是否有將 .so 文件包含到 python 包中的標准方法?

該包將僅在內部使用,不會發布到 pypi。

我認為 Wheel 包是最好的選擇——它們會創建平台特定的包,所有文件都准備好被復制,所以不需要在目標環境上構建任何東西。

您可以使用auditwheel將外部庫注入到輪中:

審計輪修復:將這些外部共享庫復制到輪本身中,並自動修改適當的 RPATH 條目,以便在運行時選取這些庫。 這實現了類似的結果,就好像庫已靜態鏈接而無需更改構建系統。 建議打包者捆綁,如靜態鏈接,可能涉及版權問題。

您可以通過通常執行以下操作來預構建外部 C++ 庫:

./configure && make && make install

這將生成一個my_external_library.so文件並將其安裝在適當的路徑中。 但是,您需要確保正確設置了庫路徑,以便審計輪發現缺失的依賴項。

export LD_LIBRARY_PATH=/usr/local/lib

然后,您可以通過執行以下命令來構建 python 輪:

python setup.py bdist_wheel

最后,您可以修復輪子,這會將my_external_library.so注入包中。

auditwheel repair my-python-wheel-1.5.2-cp35-cp35m-linux_x86_64.whl

我成功地將上述步驟應用於 python 庫confluent-kafka-python它對 librdkafka有必需的 c/c++ 依賴。


注意:auditwheel 僅適用於 Linux。 對於 MacOS,請參閱delocate工具。

Wheels 是分發 Python 包的標准方式,但是當您的擴展模塊依賴於其他so時就會出現問題。 這是因為使用了普通的 Linux 動態鏈接器,並且只在/usr/lib/usr/local/lib查找。 virtualenv安裝輪子時,這是一個問題。

據我所知,你有三個選擇:

  • 靜態鏈接,因此“包裝器”不依賴於其他任何東西;
  • 使用ctypes直接從 Python 包裝so
  • 將發行版拆分為帶有 Python 代碼和包裝器的輪子,以及一個單獨的 RPM 或 DEB,以將其安裝到/usr/lib/usr/local/lib

車輪可以工作,如果你有依賴so將其存儲在數據文件中/lib ,並安裝到根Python環境(有沒有試過),但這將打破,如果有人試圖將車輪安裝到一個virtualenv中(確實嘗試過)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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