如何用Bash/Python统计开源代码实际使用频率(学术经费申请用)
这个思路真的很务实——比起虚的下载量,实际运行频次才是科研成果被真正采用的硬证据,太适合经费申请里的影响力证明了。我帮你梳理下Python和Bash两种具体实现方案,完全满足你提到的「可关闭、无网络不影响、开源合规」这些要求:
Python 实现方案
核心逻辑是在代码入口处嵌入一段可选的统计逻辑,通过Google Analytics的测量协议发送请求(不需要依赖前端脚本,适合后端/命令行代码),同时做开关控制和异常处理,确保不影响主功能。
import requests import socket import os from datetime import datetime # 开关控制:用户可通过环境变量关闭,也可以直接修改这个变量 ENABLE_USAGE_TRACKING = os.getenv("DISABLE_MY_CODE_TRACKING", "false").lower() != "true" def track_usage(): if not ENABLE_USAGE_TRACKING: return # GA测量协议端点(官方通用地址,无需自定义URL) ga_endpoint = "https://www.google-analytics.com/collect" # 替换为你的GA跟踪ID(UA-XXXXXXXXX-X 或 GA4的G-XXXXXX) tracking_id = "UA-XXXXXXXXX-X" # 生成匿名用户标识:用主机名保证同一机器的统计归为同一用户,也可以用随机ID存在本地 user_id = socket.gethostname() # GA事件统计参数(按需调整标签/类别) params = { "v": "1", "tid": tracking_id, "cid": user_id, "t": "event", "ec": "CodeUsage", # 事件类别:标记是代码使用统计 "ea": "Executed", # 事件动作:标记代码被执行 "el": "MainModule", # 事件标签:可区分代码的不同模块 "an": "MyOpenSourceTool", # 你的工具名称 "av": "1.0.0" # 工具版本 } try: # 设置3秒超时,避免网络问题卡住代码 requests.get(ga_endpoint, params=params, timeout=3) except requests.exceptions.RequestException: # 无网络/请求失败时静默跳过,完全不影响主流程 pass # 在代码入口调用统计函数 if __name__ == "__main__": track_usage() # 你的核心业务逻辑 print("Executing my open source research code...")
关键细节说明
- 开关控制:用户只需设置环境变量
export DISABLE_MY_CODE_TRACKING=true,再运行代码就能关闭统计,无需修改代码本身。 - 无网络兼容:通过
try-except捕获所有请求异常,失败时直接跳过,主代码完全不受影响。 - 隐私合规:一定要在README/代码注释里明确告知用户:这个统计功能仅用于科研经费申请,可随时关闭,且仅收集匿名的运行频次和主机标识(无敏感数据)。
- GA配置:先在GA后台创建媒体资源拿到跟踪ID,如果用GA4(G-开头),需要调整参数为POST请求,具体参考GA官方测量协议文档即可。
Bash 实现方案
如果你的代码是Shell脚本,用curl就能实现同样的逻辑,同样兼顾开关和无网络处理:
#!/bin/bash # 开关控制:用户设置环境变量 DISABLE_TRACKING=1 即可关闭统计 ENABLE_TRACKING=${DISABLE_TRACKING:-0} track_usage() { if [ "$ENABLE_TRACKING" -eq 1 ]; then return fi # 替换为你的GA跟踪ID TRACKING_ID="UA-XXXXXXXXX-X" # 匿名用户标识:用主机名区分不同机器 USER_ID=$(hostname) # GA事件统计参数 GA_PARAMS="v=1&tid=$TRACKING_ID&cid=$USER_ID&t=event&ec=CodeUsage&ea=Executed&el=BashScript&an=MyOpenSourceTool&av=1.0.0" # 发送请求:超时3秒,静默输出避免干扰脚本正常运行 curl -s --connect-timeout 3 "https://www.google-analytics.com/collect?$GA_PARAMS" > /dev/null 2>&1 } # 调用统计函数 track_usage # 你的核心脚本逻辑 echo "Running my bash research script..."
关键细节说明
- 开关控制:用户运行
export DISABLE_TRACKING=1后再执行脚本,统计功能就会失效。 - 无网络兼容:curl设置了3秒连接超时,所有输出重定向到/dev/null,完全不影响脚本的正常输出和流程。
- 隐私说明:同样要在脚本头部注释或README里明确告知用户统计功能的用途和关闭方式。
额外优化建议
- 避免重复统计:如果你的代码可能被同一用户短时间内多次运行,可以在本地存一个时间戳文件(比如
~/.my_code_last_tracked),每天只统计一次,避免数据膨胀。 - 数据展示:GA后台可以直接查看事件的统计报表(比如每日运行次数、来自哪些主机),导出成图表后直接可以放到经费申请材料里,非常直观。
- 替代方案:如果不想用GA,也可以自己用Flask搭一个简单的统计接口,把请求数据存到SQLite数据库里,但GA免费且自带可视化,更省心。
内容的提问来源于stack exchange,提问作者llionevans
相关产品推荐
相关产品推荐

