当前位置: 首页 > news >正文

实用指南:11.22 脚本 手机termux项目分析(python)

一 场景,适合坐电梯 电梯,蹲坑

二 特点,执行快,效率高

python+源文件,

三 说明,这里不要bash,性能偶尔会翻车。

博主有时间把它集成到个人APP 「已开源」

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

"""

纯 Python · C 源码调用图分析器

依赖:universal-ctags cflow (PATH 中即可)

用法:python3 cflow_analyser.py

"""

import json

import logging

import subprocess

import re

from pathlib import Path

logging.basicConfig(level=logging.INFO, format="%(levelname)s | %(message)s")

log = logging.getLogger("analyser")

# ---------- 工具调用 ----------

def run(cmd: list, cwd=None, check=True) -> str:

"""统一 subprocess 封装,失败时自动打印 stderr"""

log.debug("RUN: %s", " ".join(cmd))

try:

cp = subprocess.run(

cmd, cwd=cwd, capture_output=True, text=True, encoding="utf-8", check=check

)

return cp.stdout

except subprocess.CalledProcessError as e:

log.error("命令失败:%s\nstderr=%s", " ".join(cmd), e.stderr)

if check:

raise

return "" # 允许跳过

# ---------- 1. cflow 文本格式 ----------

def cflow_posix(c_files: list[Path]) -> str:

"""返回 cflow --format=posix --brief 原始文本"""

if not c_files:

return ""

cmd = ["cflow", "--format=posix", "--brief", "--level=2"] + [str(f) for f in c_files]

# GNU 才支撑 --level,旧版报错就砍掉

try:

return run(cmd)

except subprocess.CalledProcessError:

cmd.remove("--level=2")

return run(cmd)

# ---------- 2. 解析 posix ----------

RE_POSIX = re.compile(

r"^(?P<caller>\w+)\(\).*? at .*?:\d+.*?>:$"

) # 匹配 caller 行

def parse_posix(text: str) -> dict[str, list[str]]:

"""把 posix 文本转成 caller->[callee...]"""

call_map: dict[str, list[str]] = {}

current = None

for line in text.splitlines():

line = line.strip()

if not line:

continue

m = RE_POSIX.match(line)

if m: # 新的 caller

current = m.group("caller")

continue

# 缩进行就是 callees

if current and line.startswith("HAL_"):

continue # 过滤 HAL 库噪音

callee = line.split("()")[0].strip()

if callee and callee != current:

call_map.setdefault(current, []).append(callee)

return call_map

# ---------- 3. ctags 拿符号 ----------

def ctags_symbols(c_file: Path) -> list[dict]:

cmd = [

"ctags",

"--output-format=json",

"--fields=+KnzS",

"--kinds-c=+f",

str(c_file),

]

out = run(cmd, check=False)

return [json.loads(l) for l in out.splitlines() if l.strip()]

# ---------- 4. 主流程 ----------

def main():

root = Path(input(" 源码目录: ")).expanduser().resolve()

if not root.is_dir():

log.error("目录不存在"); return

report = root / "callgraph.md"

c_files = sorted(root.rglob("*.c"))

h_files = sorted(root.rglob("*.h"))

# ---- 4.1 调用图 ----

log.info("正在生成调用图...")

posix_txt = cflow_posix(c_files)

call_map = parse_posix(posix_txt)

# ---- 4.2 符号表 ----

log.info("正在提取符号...")

symbols: dict[Path, list[dict]] = {}

for f in c_files + h_files:

symbols[f] = ctags_symbols(f)

# ---- 4.3 写报告 ----

with report.open("w", encoding="utf-8") as md:

md.write("# C 源码分析\n\n")

md.write(f"目录:`{root}` \n")

md.write(f"生成时间:{subprocess.check_output(['date']).decode().strip()}\n\n")

md.write("## 目录树\n```\n")

md.write(run(["tree", "-L", "2"], cwd=root))

md.write("```\n\n")

md.write("## 函数列表\n")

idx = 0

for f, syms in symbols.items():

for sym in syms:

if sym.get("kind") != "function":

continue

idx += 1

name = sym["name"]

line = sym.get("line", 0)

md.write(f"{idx}. `{name}` *{f.relative_to(root)}:{line}*\n")

md.write("\n## 调用关系\n")

for caller, callees in call_map.items():

md.write(f"\n`{caller}()` \n")

for c in callees:

md.write(f"├─▶ `{c}()` \n")

log.info("✅ 报告已生成 → %s", report)

if __name__ == "__main__":

main()

http://www.jsqmd.com/news/311908/

相关文章:

  • 2026石家庄自闭症康复机构实用指南:公办民办全覆盖,家长收藏这篇就够了
  • 2026年口碑好的陕西铝斗拱厂家最新推荐排行榜(市场调研版)
  • 2026年中钢减速机厂家推荐:针对重载与精密场景的全面评测与排名
  • 牛粪翻堆机市场新动态:2026年值得关注的源头厂家,条垛式翻堆机/轨道式翻堆机/水稻粉土机,翻堆机供应商怎么选择
  • 5 款 AI 写论文哪个好?实测后发现宏智树 AI 才是学术党终极福音
  • 2026年中钢减速机厂家排名:基于重型装备与自动化场景的全面推荐与评价
  • 9 款 AI 写论文哪个好?实测后发现:宏智树 AI 凭 “学术硬实力” 封神!
  • 2026发育迟缓康复中心硬核推荐!早干预早受益
  • 大模型Agent系统开发实战:工作流设计与最佳实践指南
  • 想找旋转蒸发仪源头厂家?这5家优质靠谱厂家直供,性价比高又可靠
  • 《你真的了解C++吗》No.029:抽象类的构造与析构——不存在的实体,存在的基石
  • 三大优选发育迟缓康复训练机构:以专业之力,护航特殊儿童成长
  • 成都3家硬核自闭症康复机构盘点|家长收藏,早期干预少走弯路
  • 2026自闭症康复机构选购指南:权威榜单+避坑攻略,家长别再踩雷
  • 看2026靠谱AI智能无损选果机生产厂家排行,选优质设备,分选机/无损分选机/西瓜选果机,AI智能无损选果机制造商推荐榜
  • 2026年水果分选机选购指南,这些生产商值得一看!无损测糖选果机/智能水果分选机/分选机,水果分选机源头厂家有哪些
  • COSMO一代星(CSK)二代星(CSG)重采样、配准
  • 天津4家优质自闭症机构排名!专业度+口碑双在线,家长收藏不踩坑
  • 自闭症机构怎么选不踩坑?2026权威推荐+避坑指南,家长收藏!
  • 星宝干预不迷路!自闭症康复机构及方法指南
  • 深入解析 virsh console:KVM虚拟化中的文本控制台魔法
  • 多店版二手车小程序源码系统,每家门店拥有独立的后台管理模块
  • 【第三方软件测试测评机构:使用LoadRunner测试HTTPS/SSL协议应用的配置和证书处理 】
  • 3.10 Helm包管理实战:复杂应用模板化部署完整教程
  • 3.11 CronJob定时任务实战:Kubernetes原生定时任务调度方案
  • 3.12 Service服务发现机制:ClusterIP、NodePort、LoadBalancer三种类型对比
  • 3.10 DaemonSet和Job控制器:节点守护进程与批处理任务完整实战
  • 救命神器10个一键生成论文工具,研究生高效写作必备!
  • 人工智能课程【数据库模块】01.数据库基础
  • 人工智能课程【数据库模块】01.数据库基础-在Ubuntu 24.04.3 LTS上安装MySQL 8并配置utf8mb4字符集