包装ldd*nix实用程序以确定程序所需的共享库。
pylddwrap的Python项目详细描述
PYLDWRAP
pyldwrap包装ldd*nix实用程序以确定程序所需的共享库。
我们需要在部署时动态打包系统的子集。因此,我们必须确定 以编程方式依赖于二进制文件的共享库。
ldd linux命令的输出虽然信息丰富,但结构不足以轻松地集成到程序中。 在撰写本文时,我们在Internet上只找到了两个可选的LDD包装 python-ldd和ldd.py,但是 输出对于我们的用例来说太基本了,或者项目还处于初级阶段。
相反,pyldwrap返回一个结构良好的依赖项列表。命令行工具输出 依赖项可以作为表(用于可视化检查)或json格式的字符串(用于其他工具)。 包含的python模块lddwrap返回带有类型注释的python对象,以便 部署脚本和其他模块。
有关ldd工具的更多信息,请参见ldd manual。
用法
命令行工具pyldwrap
- 假设我们需要/bin/ls的依赖项。以下命令将它们作为表提供:
pylddwrap /bin/ls
- 命令的输出如下:
soname | path | found | mem_address | unused ----------------+---------------------------------------+-------+----------------------+------- linux-vdso.so.1 | None | True | (0x00007ffd8750f000) | False libselinux.so.1 | /lib/x86_64-linux-gnu/libselinux.so.1 | True | (0x00007f4e73dc3000) | True libc.so.6 | /lib/x86_64-linux-gnu/libc.so.6 | True | (0x00007f4e739f9000) | False libpcre.so.3 | /lib/x86_64-linux-gnu/libpcre.so.3 | True | (0x00007f4e73789000) | False libdl.so.2 | /lib/x86_64-linux-gnu/libdl.so.2 | True | (0x00007f4e73585000) | False None | /lib64/ld-linux-x86-64.so.2 | True | (0x00007f4e73fe5000) | False libpthread.so.0 | /lib/x86_64-linux-gnu/libpthread.so.0 | True | (0x00007f4e73368000) | False
- 要获取作为json的依赖项,请调用:
pylddwrap --format json /bin/ls
- json输出的结构如下:
[ { "soname": "linux-vdso.so.1", "path": "None", "found": true, "mem_address": "(0x00007ffed857f000)", "unused": false }, ... ]
ldwrap python模块
我们提供lddwrap python模块,您可以将其集成到部署脚本和其他模块中。
- 下面的示例演示如何列出/bin/ls的依赖项:
importpathlibimportlddwrappath=pathlib.Path("/bin/ls")deps=lddwrap.list_dependencies(path=path)fordepindeps:print(dep)""" soname: linux-vdso.so.1, path: None, found: True, mem_address: (0x00007ffe8e2fb000), unused: None soname: libselinux.so.1, path: /lib/x86_64-linux-gnu/libselinux.so.1, found: True, mem_address: (0x00007f7759ccc000), unused: None soname: libc.so.6, path: /lib/x86_64-linux-gnu/libc.so.6, found: True, mem_address: (0x00007f7759902000), unused: None ... """
- 列出/bin/ls实用程序的所有依赖项,并检查是否使用了直接依赖项。 如果used for list_dependencies设置为false,则不确定依赖项的未使用变量 因此是未知的,设置为无。否则将检索有关直接使用的信息并将其添加到 依赖关系。
importpathlibimportlddwrappath=pathlib.Path("/bin/ls")deps=lddwrap.list_dependencies(path=path,unused=True)print(deps[1])# soname: libselinux.so.1,# path: /lib/x86_64-linux-gnu/libselinux.so.1,# found: True,# mem_address: (0x00007f5a6064a000),# unused: True
- lddwrap使用调用者的环境变量正常工作。如果您的依赖关系是 与当前环境不同,您需要传递一个单独的环境(以字典的形式)作为参数:
importosimportpathlibimportlddwrapenv=os.environ.copy()env['LD_LIBRARY_PATH']="some/important/path"path=pathlib.Path("/bin/ls")deps=lddwrap.list_dependencies(path=path,env=env)
安装
- 用pip: 安装pyldwrap
pip3 install pylddwrap
开发
- 查看存储库。
- 在存储库根目录中,创建虚拟环境:
python3 -m venv venv3
- 激活虚拟环境:
source venv3/bin/activate
- 安装开发依赖项:
pip3 install -e .[dev]
我们用毒物测试和包装分发。假设虚拟环境已激活,并且 已安装开发依赖项,运行:
tox
提交前检查
我们提供一组预提交检查,lint和检查代码的格式。
即,我们使用:
- yapf检查格式。
- docstrings的样式是用pydocstyle检查的。
- 使用mypy执行静态类型分析。
- 对pylint进行各种棉绒检查。
从具有开发依赖项的激活虚拟环境本地运行预提交检查:
./precommit.py
- 预提交脚本还可以自动格式化代码:
./precommit.py --overwrite