亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python3 掃描庫文件并獲取版本號信息的操作方法

 更新時間:2023年05月19日 14:26:03   作者:baiyu33  
在 C/C++ 開發(fā)中使用了第三方庫,具體說是 .a, .lib, .dll 等文件,想通過 Python 查詢出這些文件中的版本號信息,下面小編給大家?guī)砹薖ython3中掃描庫文件并獲取版本號信息的知識,需要的朋友可以參考下

1. 目的

在 C/C++ 開發(fā)中使用了第三方庫,具體說是 .a, .lib, .dll 等文件,想通過 Python 查詢出這些文件中的版本號信息。

有人可能好奇,這里簡單消除可能得疑慮:

  • 為什么不用源代碼,而用庫?

因為庫文件提供了良好的隔離性,避免了繁雜的編譯選項指定, 避免了潛在的不小心改了代碼導致的不一致

  • 為什么不用包管理工具來設定和查詢庫文件的版本?

因為 C/C++ 歷史包袱較多,不像 Java 的 Mavan, 更不像 Rust 的 Cargo + Crates。雖然有 vcpkg, conan 和 xmake 等, 但是公司自研的庫并不能很好的用這些工具管理起來

于是乎, 實際工作中不少人的工程里, 把若干個 .a 文件放在 lib 目錄下,每個庫文件名字中并沒有包含版本號信息; 而項目的運行結果不符合預期、展開排查時, 或者遞交版本時, 需要清晰的列出這些依賴庫文件的版本信息。

使用 Python 的原因:跨平臺開發(fā)速度快。

2. 原理

查詢庫文件的版本號,其實是另一個通用問題的特定版本。

通用的問題是:在一個二進制文件中, 查找所有的字符串, 找出符合預設規(guī)則的那些字符串。

查詢版本號,無非是對于公司的版本號有自己的規(guī)定, 可以從所有的字符串結果中進行過濾。由于不同公司、不同項目可能有不同的版本號規(guī)則,我們重點關注兩點:

  • 怎樣從二進制文件獲取字符串
  • 怎樣從若干字符串中獲取想要的那個

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 實現(xiàn) strings 命令

對于 Windows 用戶, 如果安裝有 Python, 則可以基于 Python 實現(xiàn) strings 命令等同的函數;由于 strings 的結果是非常多的字符串,往往還需要按版本號字符串特點進行過濾(正則匹配),繼續(xù)使用 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的版本號查找

調用剛剛實現(xiàn)的 strings() 函數, 對得到的結果進行正則匹配,例如需要以公司名字開頭,并且版本號是4位數字、用.分隔的,那么可以是這樣的實現(xiàn):

# 匹配版本號
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獲取版本號信息內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 微信小程序前端如何調用python后端的模型詳解

    微信小程序前端如何調用python后端的模型詳解

    近期需要開發(fā)一個打分的微信小程序,涉及到與后臺服務器的數據交互,這篇文章主要給大家介紹了關于微信小程序前端如何調用python后端模型的相關資料,需要的朋友可以參考下
    2022-04-04
  • Python mutiprocessing多線程池pool操作示例

    Python mutiprocessing多線程池pool操作示例

    這篇文章主要介紹了Python mutiprocessing多線程池pool操作,結合實例形式分析了Python多線程模塊multiprocessing進程池相關操作技巧,需要的朋友可以參考下
    2019-01-01
  • 詳解Python如何實現(xiàn)批量為PDF添加水印

    詳解Python如何實現(xiàn)批量為PDF添加水印

    我們有時候需要把一些機密文件發(fā)給多個客戶,為了避免客戶泄露文件,會在機密文件中添加水印。本文將利用Python實現(xiàn)批量為PDF添加水印,需要的可以參考一下
    2022-05-05
  • Django model update的多種用法介紹

    Django model update的多種用法介紹

    Django開發(fā)過程中對表(model)的增刪改查是最常用的功能之一,本文介紹筆者在使用model update過程中遇到的那些事
    2019-07-07
  • 基于Python編寫一個簡單的端口掃描器

    基于Python編寫一個簡單的端口掃描器

    端口掃描是非常實用的,不止用在信息安全方面,日常的運維也用得到。本文將利用Python編寫一個簡單的端口掃描器,需要的可以參考一下
    2022-04-04
  • Python JWT認證與pyjwt包詳細介紹

    Python JWT認證與pyjwt包詳細介紹

    JWT的聲明一般被用來在身份提供者和服務提供者間傳遞被認證的用戶身份信息,以便于從資源服務器獲取資源,也增加一些額外的其它業(yè)務邏輯所必須的聲明信息,該token也可直接被用于認證,也可被加密,這篇文章主要介紹了Python JWT認證與pyjwt包簡介,需要的朋友可以參考下
    2023-05-05
  • python之如何使用openpyxl設置單元格樣式

    python之如何使用openpyxl設置單元格樣式

    這篇文章主要介紹了python之如何使用openpyxl設置單元格樣式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Python Web開發(fā)模板引擎優(yōu)缺點總結

    Python Web開發(fā)模板引擎優(yōu)缺點總結

    這篇文章主要介紹了Python Web開發(fā)模板引擎優(yōu)缺點總結,需要的朋友可以參考下
    2014-05-05
  • 解析Python編程中的包結構

    解析Python編程中的包結構

    這篇文章主要介紹了解析Python編程中的包結構,包括對一些包管理工具的介紹,需要的朋友可以參考下
    2015-10-10
  • python 提取文件指定列的方法示例

    python 提取文件指定列的方法示例

    這篇文章主要介紹了python 提取文件指定列的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08

最新評論