最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

1. 目的

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

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

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

因?yàn)閹煳募峁┝肆己玫?strong>隔離性,避免了繁雜的編譯選項(xiàng)指定, 避免了潛在的不小心改了代碼導(dǎo)致的不一致

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

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

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

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

2. 原理

查詢庫文件的版本號,其實(shí)是另一個(gè)通用問題的特定版本。

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

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

  • 怎樣從二進(jìn)制文件獲取字符串
  • 怎樣從若干字符串中獲取想要的那個(gè)

Linux: strings 命令

在 Linux 下可以使用自帶的 strings 命令, 來列出一個(gè)二進(jìn)制文件中的所有字符串。以常用的 ls 命令為例,我們進(jìn)行查詢:

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

Windows: strings 命令

Windows 并不默認(rèn)帶有 strings 命令, 不過微軟官方提供了一個(gè)版本:

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

3. 基于 Python 實(shí)現(xiàn) strings 命令

對于 Windows 用戶, 如果安裝有 Python, 則可以基于 Python 實(shí)現(xiàn) strings 命令等同的函數(shù);由于 strings 的結(jié)果是非常多的字符串,往往還需要按版本號字符串特點(diǎn)進(jìn)行過濾(正則匹配),繼續(xù)使用 Python 的正則模塊進(jìn)行匹配是比較容易的。

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)

代碼短小精悍,簡單解釋下:

  • 我們認(rèn)為“字符串”是可以用一個(gè)正則表達(dá)式表示的: 英文字母、空格、短橫杠-、點(diǎn).、冒號:
([\w/.\s(:)-]{10,200})'
  • 我們認(rèn)為字符串的長度至少為10, 至多為 200. 這個(gè)限制的目的是, 如果允許的字符串長度太長, 搜索時(shí)間會(huì)變慢,太短則很多單個(gè)字符不符合預(yù)期結(jié)果
  • 使用 yield, 迭代方式返回結(jié)果
  • 支持 Windows, 支持 Linux, 基于 Python3

4. 基于Python的版本號查找

調(diào)用剛剛實(shí)現(xiàn)的 strings() 函數(shù), 對得到的結(jié)果進(jìn)行正則匹配,例如需要以公司名字開頭,并且版本號是4位數(shù)字、用.分隔的,那么可以是這樣的實(shí)現(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. 最終調(diào)用:一句話使用

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

到此這篇關(guān)于Python3: 掃描庫文件并獲取版本號信息的文章就介紹到這了,更多相關(guān)Python獲取版本號信息內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python實(shí)現(xiàn)梯度下降法

    python實(shí)現(xiàn)梯度下降法

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)梯度下降法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • Python基于WebSocket實(shí)現(xiàn)直播彈幕數(shù)據(jù)采集

    Python基于WebSocket實(shí)現(xiàn)直播彈幕數(shù)據(jù)采集

    本文分享了基于WebSocket的實(shí)時(shí)彈幕采集程序設(shè)計(jì),使用WebSocket接收實(shí)時(shí)彈幕,結(jié)合asyncio實(shí)現(xiàn)異步處理,將彈幕緩存并保存為日志和JSON文件,程序設(shè)計(jì)注重實(shí)時(shí)性、穩(wěn)定性和可擴(kuò)展性,適用于直播彈幕采集和其他實(shí)時(shí)數(shù)據(jù)應(yīng)用,需要的朋友可以參考下
    2026-04-04
  • 基于Tensorflow使用CPU而不用GPU問題的解決

    基于Tensorflow使用CPU而不用GPU問題的解決

    今天小編就為大家分享一篇基于Tensorflow使用CPU而不用GPU問題的解決,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • 初窺Python門縫了解入門路徑

    初窺Python門縫了解入門路徑

    Python由荷蘭數(shù)學(xué)和計(jì)算機(jī)科學(xué)研究學(xué)會(huì)的Guido van Rossum 于1990 年代初設(shè)計(jì),作為一門叫做ABC語言的替代品。 Python提供了高效的高級數(shù)據(jù)結(jié)構(gòu),還能簡單有效地面向?qū)ο缶幊?/div> 2021-10-10
  • python+pandas分析nginx日志的實(shí)例

    python+pandas分析nginx日志的實(shí)例

    下面小編就為大家分享一篇python+pandas分析nginx日志的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • 基于python實(shí)現(xiàn)復(fù)制文件并重命名

    基于python實(shí)現(xiàn)復(fù)制文件并重命名

    這篇文章主要介紹了基于python實(shí)現(xiàn)復(fù)制文件并重命名,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 利用Python-iGraph如何繪制貼吧/微博的好友關(guān)系圖詳解

    利用Python-iGraph如何繪制貼吧/微博的好友關(guān)系圖詳解

    這篇文章主要給大家介紹了關(guān)于利用Python-iGraph如何繪制貼吧/微博好友關(guān)系圖的相關(guān)資料,文中顯示介紹了在windows系統(tǒng)下安裝python-igraph的步驟,然后通過示例代碼演示了繪制好友關(guān)系圖的方法,需要的朋友可以參考下。
    2017-11-11
  • Python Pandas處理csv文件常用示例

    Python Pandas處理csv文件常用示例

    Pandas是一個(gè)非常強(qiáng)大的數(shù)據(jù)操作python包,支持各種數(shù)據(jù)格式,包括CSV文件,本文就來介紹一下Python Pandas處理csv文件常用示例,感興趣的可以了解一下
    2023-12-12
  • Django INSTALLED_APPS配置使用

    Django INSTALLED_APPS配置使用

    在Django里INSTALLED_APPS是settings.py文件中的一個(gè)關(guān)鍵配置項(xiàng),本文主要介紹了Django INSTALLED_APPS配置,感興趣的可以了解一下
    2025-07-07
  • pandas如何處理缺失值

    pandas如何處理缺失值

    這篇文章主要介紹了pandas如何處理缺失值,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07

最新評論

澳门| 根河市| 安达市| 望都县| 沛县| 札达县| 大港区| SHOW| 南昌县| 金山区| 图们市| 常山县| 南昌县| 郴州市| 门头沟区| 临澧县| 应城市| 平度市| 凤翔县| 东明县| 商南县| 盈江县| 浦江县| 沂源县| 万安县| 溧阳市| 长治市| 庄河市| 特克斯县| 攀枝花市| 太仆寺旗| 揭东县| 商河县| 博野县| 玉屏| 调兵山市| 临漳县| 沅江市| 油尖旺区| 任丘市| 大余县|