![](/img/trans.png)
[英]How to include external shell scripts with bdist_wheel in 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
;/usr/lib
或/usr/local/lib
。 車輪可以工作,如果你有依賴so
將其存儲在數據文件中/lib
,並安裝到根Python環境(有沒有試過),但這將打破,如果有人試圖將車輪安裝到一個virtualenv中(確實嘗試過)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.