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

vvl*_*rov 20 python shared-libraries python-cffi python-wheel

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

有没有标准的方法将.so文件包含到python包中?

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

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

qui*_*hts 15

您可以使用auditwheel将外部库注入轮子:

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

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

./configure && make && make install
Run Code Online (Sandbox Code Playgroud)

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

export LD_LIBRARY_PATH=/usr/loca/lib
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过执行以下命令来构建python轮:

python setup.py bdist_wheel
Run Code Online (Sandbox Code Playgroud)

最后,您可以修理车轮,将车轮注入my_external_library.so包装.

auditwheel repair my-python-wheel-1.5.2-cp35-cp35m-linux_x86_64.whl
Run Code Online (Sandbox Code Playgroud)

我成功地将上述步骤应用于python库confluent-kafka-python,它对librdkafka具有必需的c/c ++依赖性.


Eve*_*rtW 5

轮子是分发Python包的标准方式,但是当你有依赖于其他so人的扩展模块时会出现问题.这是因为使用了普通的Linux动态链接器,并且只查看/usr/lib/usr/local/lib.安装车轮时出现问题virtualenv.

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

  • 静态链接,因此'包装器'不依赖于任何其他东西;
  • 使用ctypes的包裹so直接从Python中;
  • 分割分发与Python代码&包装纸,和一个单独的RPM或DEB车轮到如此安装到任意/usr/lib/usr/local/lib.

车轮可以工作,如果你有依赖so的数据文件存储在/lib安装到根Python环境(有没有试过),但如果有人试图将车轮安装到一个virtualenv中(没有尝试,这将打破).

  • 为什么不能将“so”文件保留在 site-packages/ 下的包目录中? (3认同)