如何使用python wheel包包含外部库

时间:2014-05-28 15:42:36

标签: python shared-libraries python-wheel python-cffi

我想在Linux上使用cffi模块创建嵌入和使用外部库(.so)的python包。

是否有将.so文件包含在python包中的标准方法?

该软件包仅在内部使用,不会发布到pypi。

我认为Wheel包是最好的选择 - 他们会创建特定于平台的包,所有文件都可以复制,因此不需要在目标环境中构建任何东西。

2 个答案:

答案 0 :(得分:13)

您可以使用auditwheel将外部库注入方向盘:

  

auditwheel修复:将这些外部共享库复制到轮子本身,并自动修改相应的RPATH条目,以便在运行时拾取这些库。这实现了类似的结果,就好像已经静态链接库而无需更改构建系统。打包者被告知捆绑(如静态链接)可能会引起版权问题。

您可以通过执行以下操作来预先构建外部c ++库:

./configure && make && make install

这将生成my_external_library.so文件并将其安装在适当的路径中。但是,您需要确保正确设置库路径,以便auditwheel发现缺少的依赖项。

export LD_LIBRARY_PATH=/usr/loca/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 ++依赖。

答案 1 :(得分:5)

轮子是分发Python包的标准方式,但是当您拥有依赖于其他so的扩展模块时会出现问题。这是因为使用了普通的Linux动态链接器,只能查看/usr/lib/usr/local/lib。在virtualenv中安装滚轮时,这是一个问题。

据我所知,您有三种选择:

  • 静态链接,所以'包装'不依赖于任何其他事情;
  • 使用ctypes直接从Python包装so;
  • 使用Python代码&amp ;;将分布拆分为方向盘。包装器,以及单独的RPM或DEB,将其安装到/usr/lib/usr/local/lib

如果您将从属so作为数据文件包含在/lib中并安装到根Python环境中,那么可能 尝试过),但是如果有人试图将这个轮子安装到virtualenv(确实试过那个),这将会破坏。