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

 更新时间:2023年05月19日 14:26:03   作者:baiyu33  
在 C/C++ 开发中使用了第三方库,具体说是 .a, .lib, .dll 等文件,想通过 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

Windows: strings 命令

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

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

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')

到此这篇关于Python3: 扫描库文件并获取版本号信息的文章就介绍到这了,更多相关Python获取版本号信息内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python实现梯度下降法

    python实现梯度下降法

    这篇文章主要为大家详细介绍了python实现梯度下降法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • Python基于WebSocket实现直播弹幕数据采集

    Python基于WebSocket实现直播弹幕数据采集

    本文分享了基于WebSocket的实时弹幕采集程序设计,使用WebSocket接收实时弹幕,结合asyncio实现异步处理,将弹幕缓存并保存为日志和JSON文件,程序设计注重实时性、稳定性和可扩展性,适用于直播弹幕采集和其他实时数据应用,需要的朋友可以参考下
    2026-04-04
  • 基于Tensorflow使用CPU而不用GPU问题的解决

    基于Tensorflow使用CPU而不用GPU问题的解决

    今天小编就为大家分享一篇基于Tensorflow使用CPU而不用GPU问题的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • 初窥Python门缝了解入门路径

    初窥Python门缝了解入门路径

    Python由荷兰数学和计算机科学研究学会的Guido van Rossum 于1990 年代初设计,作为一门叫做ABC语言的替代品。 Python提供了高效的高级数据结构,还能简单有效地面向对象编程
    2021-10-10
  • python+pandas分析nginx日志的实例

    python+pandas分析nginx日志的实例

    下面小编就为大家分享一篇python+pandas分析nginx日志的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • 基于python实现复制文件并重命名

    基于python实现复制文件并重命名

    这篇文章主要介绍了基于python实现复制文件并重命名,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 利用Python-iGraph如何绘制贴吧/微博的好友关系图详解

    利用Python-iGraph如何绘制贴吧/微博的好友关系图详解

    这篇文章主要给大家介绍了关于利用Python-iGraph如何绘制贴吧/微博好友关系图的相关资料,文中显示介绍了在windows系统下安装python-igraph的步骤,然后通过示例代码演示了绘制好友关系图的方法,需要的朋友可以参考下。
    2017-11-11
  • Python Pandas处理csv文件常用示例

    Python Pandas处理csv文件常用示例

    Pandas是一个非常强大的数据操作python包,支持各种数据格式,包括CSV文件,本文就来介绍一下Python Pandas处理csv文件常用示例,感兴趣的可以了解一下
    2023-12-12
  • Django INSTALLED_APPS配置使用

    Django INSTALLED_APPS配置使用

    在Django里INSTALLED_APPS是settings.py文件中的一个关键配置项,本文主要介绍了Django INSTALLED_APPS配置,感兴趣的可以了解一下
    2025-07-07
  • pandas如何处理缺失值

    pandas如何处理缺失值

    这篇文章主要介绍了pandas如何处理缺失值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07

最新评论