包装ldd*nix实用程序以确定程序所需的共享库。

pylddwrap的Python项目详细描述


PYLDWRAP

Build StatusCoverageMIT LicensePyPI - versionPyPI - Python VersionDocumentation Status

pyldwrap包装ldd*nix实用程序以确定程序所需的共享库。

我们需要在部署时动态打包系统的子集。因此,我们必须确定 以编程方式依赖于二进制文件的共享库。

ldd linux命令的输出虽然信息丰富,但结构不足以轻松地集成到程序中。 在撰写本文时,我们在Internet上只找到了两个可选的LDD包装 python-lddldd.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

版本控制

我们跟着Semantic Versioning。版本x.y.z表示:

  • X是主要版本(向后不兼容),
  • y是次要版本(向后兼容),并且
  • z是修补程序版本(向后兼容的错误修复)。

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

推荐PyPI第三方库


热门话题
java无法打印/获取2D数组的特定行   java替换JSP web应用程序中的默认resourceBundle和resourceControl实现   java将地图坐标转换为屏幕坐标   Guava地图中的java惰性驱逐   反射Java getDeclaredConstructor失败,来自JUnit的NoSuchMethodException   java有一个基于正则表达式的web servlet过滤器。xml?   java如何在Android中隐藏/显示表单?   java 7的简单代码度量独立maven插件   sockets java中哪种技术可用于在两个不同系统之间传输大量同步数据?   java无法处理我的导航菜单项的单击事件   java阵列输出必须是一年中的几个月   java Elasticsearch错误:MapperParsingException:无法分析   java 安卓复制文件显示错误   JSF2.2JavaJSF网站使用BootsFaces页面直接构建   Java中while循环的BigO   java如何使用AspectJ在AOP中创建每个类、每个对象和每个方法/源位置部分的方面   从地图查看java文本   java如何从线程触发PropertyChange事件?   java Spring引导在运行时添加和删除单例