
纯标准库的跨平台机器信息采集单元IntelliJ 平台实验 Notebook 的 Machine Info Cell 实战指南【免费下载链接】intellij-communityIntelliJ IDEA IntelliJ Platform项目地址: https://gitcode.com/GitHub_Trending/in/intellij-community在 Jupyter Notebook 中复现性能实验时记录运行环境主机名、操作系统、CPU 型号、内存总量是结果可复现的必备前提。本文以 IntelliJ Platform 开源仓库.agents/skills/notebook-for-experiment中定义的 Machine Info Cell 为蓝本深入讲解一个仅依赖 Python 标准库、不安装 psutil可同时运行于 Windows、macOS、Linux 三平台的机器信息采集方案并结合仓库内的 notebook 规范与辅助工具说明其使用场景、实现原理与扩展方式。一、背景为什么实验 Notebook 需要一个机器信息单元在 IntelliJ Platform 仓库中性能实验类 Notebook 遵循.agents/skills/notebook-for-experiment/SKILL.md定义的标准 cell 布局#类型用途0markdown标题测量什么采集数据所用的完整 shell 命令1code配置 —— 仅保留用户可编辑变量2codeMachine info主机、OS、CPU、RAM3code导入 数据加载4..Ncode分析 —— 解析、统计、绘图、表格lastmarkdown复现数据所需的完整补丁fenced diff其中第 2 个 cell 即本文主角 Machine Info Cell其实现在 reference/machine-info.md 中给出。它的作用是在每次实验运行时自动记录物理运行环境配合布局中第 0 个 cell 的“固定 commit 哈希 完整补丁 精确运行命令”构成三要素之一的可复现性保障不同工程师、不同机器上重跑同一个 notebook能明确判断环境差异对测量结果的影响。仓库自带的实验 notebook 实例位于 docs/notebooks如1-ContextPropagation.ipynb、2-CancellationModel.ipynb、3-ReadWriteLock.ipynb均以 Kotlin 测量 IntelliJ 平台内部机制上下文传播、取消模型、读写锁的性能特征这类测量对 CPU 型号与内存容量高度敏感因此在每次采集前打印机器信息是标准流程的一部分。二、设计约束为何坚持“纯标准库”该实现最突出的设计取舍是Stdlib-only仅标准库明确排除 psutil。理由如下零额外依赖platform、subprocess、ctypes均为 Python 标准库模块任何带 Python 3 解释器的环境都可直接运行无需pip install psutil与 uv 临时环境兼容本仓库的实验 notebook 统一通过uv run执行见 nb.py 的 PEP 723 内联依赖声明依赖越少冷启动越快、环境越不易出错跨平台一致同一段代码在 Windows、macOS、Linux 上各自走对应的系统调用路径输出格式统一便于 notebook 内后续分析统一处理。三、CPU 型号采集_cpu_name()def _cpu_name() - str: s platform.system() try: if s Windows: # wmic is deprecated on Windows 11; use PowerShell CIM instead. return subprocess.check_output( [powershell, -NoProfile, -Command, (Get-CimInstance Win32_Processor).Name], stderrsubprocess.DEVNULL, ).decode().strip() if s Darwin: return subprocess.check_output( [sysctl, -n, machdep.cpu.brand_string], stderrsubprocess.DEVNULL ).decode().strip() # Linux for line in open(/proc/cpuinfo): if line.startswith(model name): return line.split(:, 1)[1].strip() except Exception: pass return platform.processor() or unknown逐平台实现细节Windows源码注释明确说明wmic在 Windows 11 上已废弃因此改用 PowerShell 的 CIM 查询(Get-CimInstance Win32_Processor).Name。相比 WMICIMCommon Information Model基于 WS-Management 协议输出是结构化的处理器名称如Intel(R) Core(TM) i9-13900K。-NoProfile用于跳过 PowerShell 启动时的配置文件加载加快调用速度。macOSDarwin通过sysctl -n machdep.cpu.brand_string读取 CPU 品牌字符串这是 macOS 上获取完整型号名最直接的手段。Linux直接逐行扫描/proc/cpuinfo找到第一个以model name开头的行按冒号切分取右半段并去空白。/proc/cpuinfo是内核虚拟文件读取成本极低无需外部命令。兜底任何异常命令不存在、权限问题、文件缺失都被except Exception: pass吞掉最终回退到platform.processor()该函数在 Windows 上返回AMD64、Intel64等架构名在部分平台可能返回空串空串时记为unknown。这一兜底保证 cell 永不因机器信息采集失败而中断 notebook 执行。四、内存总量采集_ram_gb()def _ram_gb() - float: s platform.system() try: if s Windows: import ctypes class _M(ctypes.Structure): _fields_ [ (dwLength, ctypes.c_ulong), (dwMemoryLoad, ctypes.c_ulong), (ullTotalPhys, ctypes.c_ulonglong), (ullAvailPhys, ctypes.c_ulonglong), (ullTotalPageFile, ctypes.c_ulonglong), (ullAvailPageFile, ctypes.c_ulonglong), (ullTotalVirtual, ctypes.c_ulonglong), (ullAvailVirtual, ctypes.c_ulonglong), (sullAvailExtendedVirtual,ctypes.c_ulonglong), ] m _M() m.dwLength ctypes.sizeof(m) ctypes.windll.kernel32.GlobalMemoryStatusEx(ctypes.byref(m)) return m.ullTotalPhys / 1024**3 if s Darwin: out subprocess.check_output( [sysctl, -n, hw.memsize], stderrsubprocess.DEVNULL ).decode().strip() return int(out) / 1024**3 # Linux for line in open(/proc/meminfo): if line.startswith(MemTotal): return int(line.split()[1]) / 1024**2 except Exception: pass return float(nan)逐平台实现细节Windows这是三平台中最复杂的路径。由于没有 psutil直接通过ctypes调用 Windows APIkernel32.GlobalMemoryStatusEx。为此用ctypes.Structure精确声明MEMORYSTATUSEX结构体——注意其字段顺序、类型dwLength为c_ulong物理/虚拟内存字段为c_ulonglong64 位整数必须与 Win32 头文件一致且调用前必须把dwLength设为结构体大小m.dwLength ctypes.sizeof(m)否则 API 调用会失败。ullTotalPhys为物理内存字节数除以1024**3换算为 GB。macOSsysctl -n hw.memsize直接输出字节数转int后除以1024**3。Linux扫描/proc/meminfo的MemTotal行。注意该行单位是kB因此除以1024**2才是 GB——这与 macOS/Windows 路径除以1024**3不同是两个容易写错的分母细节。兜底异常时返回float(nan)。选用 NaN 而非0或抛出异常是为了让后续打印仍能执行print(fRAM : {_ram_gb():.0f} GB)会把 NaN 格式化为nan同时明确标记“该值不可用”避免误把 0 当作真实的 0GB 内存。五、汇总输出与在 Notebook 中的使用方式print(fHost : {platform.node()}) print(fOS : {platform.system()} {platform.release()} ({platform.version()})) print(fCPU : {_cpu_name()}) print(fRAM : {_ram_gb():.0f} GB)输出四行信息Hostplatform.node()返回主机名Windows 上即环境变量COMPUTERNAMELinux/macOS 为hostnameOSplatform.system()release()version()组合如Linux 6.8.0-45-generic (#45-Ubuntu SMP ...)或Darwin 24.0.0 (Darwin Kernel Version 24.0.0 ...)CPU上一节得到的品牌型号字符串RAM整数 GB.0f格式化为无小数位如64 GB。放入 notebook 的标准姿势结合.agents/skills/notebook-for-experiment/SKILL.md的使用规范该 cell 位于标准布局的第 2 个 cellcell 0 标题、cell 1 配置之后作为 code cell 整体粘贴即可notebook 定稿后运行uv run ${CLAUDE_SKILL_DIR}/scripts/nb.py collapse-cells notebook.ipynb折叠全部代码 cell只保留配置 cell 可见机器信息 cell 同样被折叠仅在executeRun All时输出环境信息若希望该 cell 始终可见可在其 metadata 中打上nb:visible标签例如nb[cells][2][metadata].setdefault(tags, []).append(nb:visible)。与日志采集的配合本 skill 还配套提供日志定位参考 reference/log-files.mdIDE Starter 测试的日志位于repo/out/ide-tests/tests/productCode-buildNumber/testName/log/idea*.log普通测试则写入共享的system/test/testlog/idea*.log并依赖LogTestName标记切分。机器信息 cell 与日志解析 cell 组合即可在分析阶段同时拿到“环境快照 测量数据”这也是标准布局中 cell 2 紧邻 cell 3导入与数据加载的原因。六、可复现性视角下的价值.agents/skills/notebook-for-experiment/SKILL.md的 Reproducibility 一节要求每个实验 notebook 具备固定 commit 哈希、末 cell 完整补丁、精确运行命令。Machine Info Cell 补上了第四块拼图——环境参数同一 commit、同一补丁在不同 CPU/内存的机器上性能数值天然不同有了机器信息输出比对结果时能第一时间排除“环境不同”这一变量测量对象是 IntelliJ 平台这类重型 JVM 应用如docs/notebooks中的上下文传播、读写锁实验索引构建、GC 行为都直接受 CPU 与内存影响机器信息是不可或缺的元数据cell 采用“失败静默降级”策略CPU 回退unknown、RAM 回退nan确保即使某平台调用失败也不破坏nb.py execute的整本执行流程——这与 SKILL.md 中“分析 cell 绝不raise/sys.exit()”的可用性守则一致。七、扩展建议基于现有代码结构的合理推断从实现结构看该 cell 采用“每平台一个分支 统一兜底”的模板可以自然地扩展增加磁盘信息Linux 读/proc/mounts或shutil.disk_usagemacOS 用df -k解析Windows 用 ctypes 调GetDiskFreeSpaceExW增加 CPU 核心数os.cpu_count()标准库内置三平台通用即可补充逻辑核数增加 GPU 信息Windows 可沿用 PowerShell CIMGet-CimInstance Win32_VideoControllerLinux 可读/proc/driver/nvidia/gpus或lspci需外部命令需自行权衡“纯标准库”约束是否让位输出结构化若分析阶段需要把环境信息并入 pandas DataFrameSKILL.md 建议表格统一走 pandas可将四行输出改为返回 dict 而非print由 cell 3 汇总。扩展时请保持原 cell 的两条铁律不引入非标准库依赖、任何失败都静默降级而不中断执行即可与仓库现有的 notebook 规范无缝衔接。八、小结Machine Info Cell 是 IntelliJ Platform 仓库实验 notebook 工作流中一个微小但关键的标准化单元以约 60 行纯标准库 Python覆盖 WindowsPowerShell CIM ctypes、macOSsysctl与 Linux/proc 虚拟文件三平台的 CPU 与内存采集并在任何异常下降级为unknown/nan保证执行不中断。它直接服务于.agents/skills/notebook-for-experiment/SKILL.md定义的“可复现实验”目标配合固定 commit、内嵌补丁与精确命令构成性能实验结果的完整证据链。在仓库的 reference/machine-info.md 中即可直接取用这份实现。【免费下载链接】intellij-communityIntelliJ IDEA IntelliJ Platform项目地址: https://gitcode.com/GitHub_Trending/in/intellij-community创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考