我想在Linux上使用cffi模块创建嵌入和使用外部库(.so
)的python包。
是否有将.so文件包含在python包中的标准方法?
该软件包仅在内部使用,不会发布到pypi。
我认为Wheel包是最好的选择 - 他们会创建特定于平台的包,所有文件都可以复制,因此不需要在目标环境中构建任何东西。
答案 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
; /usr/lib
或/usr/local/lib
。如果您将从属so
作为数据文件包含在/lib
中并安装到根Python环境中,那么可能