网络编程
位置:首页>> 网络编程>> Python编程>> Python3 扫描库文件并获取版本号信息的操作方法

Python3 扫描库文件并获取版本号信息的操作方法

作者:baiyu33  发布时间:2023-08-11 19:14:17 

标签:Python,版本号,扫描库文件

Python3 扫描库文件并获取版本号信息的操作方法

1. 目的

在 C/C++ 开发中使用了第三方库,具体说是 .a, .lib, .dll 等文件,想通过 Python 查询出这些文件中的版本号信息。

有人可能好奇,这里简单消除可能得疑虑:

  • 为什么不用源代码,而用库?

因为库文件提供了良好的隔离性,避免了繁杂的编译选项指定, 避免了潜在的不小心改了代码导致的不一致

  • 为什么不用包管理工具来设定和查询库文件的版本?

因为 C/C++ 历史包袱较多,不像 Java 的 Mavan, 更不像 Rust 的 Cargo + Crates。虽然有 vcpkg, conan 和 xmake 等, 但是公司自研的库并不能很好的用这些工具管理起来

于是乎, 实际工作中不少人的工程里, 把若干个 .a 文件放在 lib 目录下,每个库文件名字中并没有包含版本号信息; 而项目的运行结果不符合预期、展开排查时, 或者递交版本时, 需要清晰的列出这些依赖库文件的版本信息。

使用 Python 的原因:跨平台开发速度快

2. 原理

查询库文件的版本号,其实是另一个通用问题的特定版本。

通用的问题是:在一个二进制文件中, 查找所有的字符串, 找出符合预设规则的那些字符串。

查询版本号,无非是对于公司的版本号有自己的规定, 可以从所有的字符串结果中进行过滤。由于不同公司、不同项目可能有不同的版本号规则,我们重点关注两点:

  • 怎样从二进制文件获取字符串

  • 怎样从若干字符串中获取想要的那个

Linux: strings 命令

在 Linux 下可以使用自带的 strings 命令, 来列出一个二进制文件中的所有字符串。以常用的 ls 命令为例,我们进行查询:

zz@Legion-R7000P% which strings  
/usr/bin/strings
zz@Legion-R7000P% strings /bin/ls | more

Python3 扫描库文件并获取版本号信息的操作方法

Windows: strings 命令

Windows 并不默认带有 strings 命令, 不过微软官方提供了一个版本:

https://docs.microsoft.com/zh-cn/sysinternals/downloads/strings

Python3 扫描库文件并获取版本号信息的操作方法

3. 基于 Python 实现 strings 命令

对于 Windows 用户, 如果安装有 Python, 则可以基于 Python 实现 strings 命令等同的函数;由于 strings 的结果是非常多的字符串,往往还需要按版本号字符串特点进行过滤(正则匹配),继续使用 Python 的正则模块进行匹配是比较容易的。

def strings(fname):
   """
   Remake `strings` command in Python
   This function behaves like `strings` command in linux/windows.
   If no desired result returned, you may just tweak the regular expression pattern.
   ref: https://gist.github.com/berdario/114b2daf9b43fe924676
   Example:
   import arczip
   for word_bytes in arczip.strings(lib_pth):
       word = word_bytes.decode()
       if ('version' in word):
           print(word)
   """
   from mmap import mmap, ACCESS_READ
   import re
   pattern = '([\w/.\s(:)-]{10,200})'
   with open(fname, 'rb') as f, mmap(f.fileno(), 0, access=ACCESS_READ) as m:
       for match in re.finditer(pattern.encode(), m):
           yield match.group(0)

代码短小精悍,简单解释下:

  • 我们认为“字符串”是可以用一个正则表达式表示的: 英文字母、空格、短横杠-、点.、冒号:

([\w/.\s(:)-]{10,200})'
  • 我们认为字符串的长度至少为10, 至多为 200. 这个限制的目的是, 如果允许的字符串长度太长, 搜索时间会变慢,太短则很多单个字符不符合预期结果

  • 使用 yield, 迭代方式返回结果

  • 支持 Windows, 支持 Linux, 基于 Python3

4. 基于Python的版本号查找

调用刚刚实现的 strings() 函数, 对得到的结果进行正则匹配,例如需要以公司名字开头,并且版本号是4位数字、用.分隔的,那么可以是这样的实现:

# 匹配版本号
def containVersion(word):
   versionPattern = r"_\d{1,3}.\d{1,3}.\d{1,10}.\d{1,5}"
   match = re.search(versionPattern, word)
   if (match is not None):
       return True
   return False
# 给定库文件, 打印匹配到的版本号
def print_module_version(lib_pth):
   for word_bytes in strings(lib_pth):
       word = word_bytes.decode()
       if (word.startswith('YourCompany') and containVersion(word)):
           print(word)
       elif (word.startswith('your_company') and containVersion(word)):
           print(word)

5. 最终调用:一句话使用

if __name__ == '__main__':
   print_module_version('D:/work/kaku-project/lib/windows-x64/libObjectDetection.lib')
   print_module_version('D:/work/kaku-project/lib/windows-x64/libObjectDetection.dll')
   print_module_version('D:/work/kaku-project/lib/linux-arm64/libObjectDetection.a')

来源:https://blog.csdn.net/baiyu33/article/details/130695056

0
投稿

猜你喜欢

  • 查询速度慢的原因很多,常见如下几种:1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)2、I/O吞吐量小,形成了瓶颈效
  • SQL Server管理,你做得好吗?下文这些可能会对你的工作有一些帮助,不妨耐心的看看吧。1. 数据库文件有.mdf .ndf .ldf三
  • 最近基于selenium写了一个python小工具,记录下学习记录,自己运行的环境是Ubuntu 14.04.4, Python 2.7,C
  • 神经网络框架使用方法及设计思想在框自己手写架上基本模仿pytorch,用以学习神经网络的基本算法,如前向传播、反向传播、各种层、各种激活函数
  • 如果查询结果很多,服务器解释你的ASP script将花费大量的时间,因为有许多的Response.Write语句要处理. 如果你将输出的全
  • 【实用系列】-- 胖页面载入,加载JavaScript效果整理了一下代码,做了一些优化,算是最终版了。完全不需要对其他文件做任何修改,就是所
  • 网页过渡是指当浏览者进入或离开网页时,页面呈现的不同的刷新效果,比如卷动、百叶窗等。注:通过模板所建网页无法添加网页过渡效果!制作步骤:1、
  • 从AspJpeg1.8 版本开始,AspJpeg 提供了比 PrintText 更为灵活的文本绘图方法PrintTextEx,PrintTe
  • Microsoft建立了一种既灵活又强大的安全管理机制,它能够对用户访问SQL Server服务器系统和数据库的安全进行全面地管理。按照本文
  • 有一台windows服务器上跑着mysql的一些应用,现在需要将mysql的数据每天备份,并通过ftp上传到指定的存储服务器上要是在linu
  • 不知大家对精华区的表格排序终极优化是否还有记忆,当时讨论的结果曾以为是最快的JS排序了,实则不然,按前段时间我发的DHTML性能提升帖(转译
  • 存储过程的优缺点: 存储过程优点: 1.由于应用程序随着时间推移会不断更改,增删功能,T-SQL过程代码会变得更复杂,StoredProce
  • 原文地址:30 Days of Mootools 1.2 Tutorials - Day 15 - SlidersMooTools 1.2的
  • 如何把程序打包为whl首先需要一个库:setuptools如果是conda环境的话,这个包是自带的,不需要另外安装。首先把需要打包的py文件
  • 微软昨天在其2009年专业开发者大会上展示了下一个版本的Internet Explorer浏览器IE9。尽管只是一个早期版本,IE开发团队还
  • 在IE7还不支持counter 和increment 属性之前,我从来没有用过它们,也从来没有使用过:before 伪元素和content
  • 用户体验(User Experience,简称UE)是用户在使用产品过程中建立起来的一种纯主观感受。在基于Web的产品设计中,UE是一个相对
  • 在CSS森林群里讨论一个margin的问题中无意间发现overflow也可以用来清除浮动,嘿嘿,这个方法不单使用简单,而且FF、OP、IE7
  • meta是用来在HTML文档中模拟HTTP协议的响应头报文。meta 标签用于网页的<head>与</head&
  • 一、Flask蓝图目录我们之前写的Flask项目都是自己组织的目录结构,其实Flask官方有其推荐的目录结构,以下就是一个符合官方推荐的Fl
手机版 网络编程 asp之家 www.aspxhome.com