跨发行版Linux控制盘

auditwheel的Python项目详细描述


https://travis-ci.org/pypa/auditwheel.svg?branch=masterhttps://badge.fury.io/py/auditwheel.svg

审核和重新标记PEP 513 manylinux1PEP 571 manylinux2010Linux控制盘。

概述

auditwheel是一个命令行工具,用于帮助创建python wheel packages对于包含预编译的linux 二进制扩展与多种Linux发行版兼容, 与PEP 513 manylinux1PEP 571 manylinux2010平台标记一致

auditwheel show:显示控制盘所依赖的外部共享库 (超出manylinux策略中包含的库),以及 检查扩展模块是否使用超过 manylinuxABI

auditwheel repair:将这些外部共享库复制到控制盘本身, 并自动修改适当的RPATH条目,以便这些库 将在运行时提取。这会产生类似的结果,就像库 已静态链接,无需更改生成系统包装商是 建议捆绑,如静态链接,可能涉及版权问题。

安装

auditwheel可以使用pip安装:

pip3 install auditwheel

它需要Python3.5+,并在Linux上运行。它要求shell命令 unzipPATH中可用只有使用基于ELF的链接的系统 支持(这基本上应该是每个linux)。

一般来说,构建manylinux1wheels需要在centos5上运行 机器和建筑manylinux2010车轮需要在CentOS6上运行 机器,因此我们建议使用预先构建的manylinuxDocker images,例如

$ docker run -i -t -v `pwd`:/io quay.io/pypa/manylinux1_x86_64 /bin/bash

示例

检查车轮:

$ auditwheel show cffi-1.5.0-cp35-cp35m-linux_x86_64.whl

cffi-1.5.0-cp35-cp35m-linux_x86_64.whl is consistent with the
following platform tag: "linux_x86_64".

The wheel references the following external versioned symbols in
system-provided shared libraries: GLIBC_2.3.

The following external shared libraries are required by the wheel:
{
    "libc.so.6": "/lib64/libc-2.5.so",
    "libffi.so.5": "/usr/lib64/libffi.so.5.0.6",
    "libpthread.so.0": "/lib64/libpthread-2.5.so"
}

In order to achieve the tag platform tag "manylinux1_x86_64" the
following shared library dependencies will need to be eliminated:

libffi.so.5

修理轮子。

$ auditwheel repair cffi-1.5.2-cp35-cp35m-linux_x86_64.whl
Repairing cffi-1.5.2-cp35-cp35m-linux_x86_64.whl
Grafting: /usr/lib64/libffi.so.5.0.6
Setting RPATH: _cffi_backend.cpython-35m-x86_64-linux-gnu.so to "$ORIGIN/.libs_cffi_backend"
Previous filename tags: linux_x86_64
New filename tags: manylinux1_x86_64
Previous WHEEL info tags: cp35-cp35m-linux_x86_64
New WHEEL info tags: cp35-cp35m-manylinux1_x86_64

Fixed-up wheel written to /wheelhouse/cffi-1.5.2-cp35-cp35m-manylinux1_x86_64.whl

限制

  1. auditwheel使用DT_NEEDED 来自python扩展模块的信息(如ldd)来确定 它们所依赖的系统库。动态地 在运行时使用ctypes/cffi(来自python)加载库,或者 {t1616}$(来自C/C++)不以某种方式包含这些信息。 是静态确定的,所以通过 机制将被忽略

  2. 如果编译二进制文件,如果编译它们,我们就无能为力了。 链接到libclibstdc++的最新版本。这些 库(和其他一些库)使用符号版本控制来向后 兼容性。一般来说,这意味着 旧版本的glibc在具有较新版本的 glibc,但是在新系统上编译的代码不会/可能不会运行 在旧系统上。

    因此,要编译广泛兼容的二进制文件,最好执行构建 在旧的linux发行版上,比如manylinux docker映像。

测试

测试可以使用tox运行,它将自动安装 测试依赖项。

有些集成测试还需要一个正在运行且可访问的docker 守护进程。如果还没有,这些测试将提取一些Docker图像 在您的系统上可用,但它不会更新现有的图像。 要手动更新这些图像,请运行:

docker pull python:3.5
docker pull quay.io/pypa/manylinux1_x86_64
docker pull quay.io/pypa/manylinux2010_x86_64

您也可以使用docker rmi删除这些图像。

行为准则

auditwheel项目的代码库中进行交互的每个人,问题跟踪器, 聊天室和邮件列表应遵循 PyPA Code of Conduct

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java结合两个Date实例使用Joda创建datetime   带有POI和FileOutputStream的java Swing应用程序性能问题   Java中是否存在类似于Python的异常?   Java中有界通配符的泛型   使用字符和子字符串的java不同输出   在Java中获取LDAP模式   java自定义类在自身上生成ClassNotFoundException   java连接到从internet到通过LAN连接到internet的系统的serversocket   java如何通过maven在jaxws中使用jaxb插件?   java Kerberos如何获取主体或客户端名称?   java应用服务器中是否有JDBC的单点登录解决方案?   java是存储矩阵值以便以后访问的更好方法   Java等级计算器。开始这门课我需要一些帮助   未找到Android“libc++\u shared.so”中的java OpenCV实现   当我使用web配置部署描述符时使用java。xml。它显示了错误   java为什么我的ArrayList的add方法冲突,如何编辑我的自定义add方法   java创建一个以集合为键的映射?   java如何将用户输入到数字三角形中   为什么Java在读取LinkedHashMap时会自动从字符串转换为整数   类动态创建和读取java类