python -m 背后的标准库 CLI 一直在悄悄进化。3.13/3.14 两个版本里,一批工具要么是新面孔,要么换了更顺手的调用方式。这篇全部给命令与真实输出——凡标"实测"的都是我们真跑过的,其余注明"官方文档"。
1. python -m json:JSON 校验/格式化换了正式门牌(3.14)
3.14 起,json 模块可以直接 -m 运行,官方明确它取代 json.tool(后者进入 soft deprecated,不会删除):
# 校验 + 美化(stdin 模式)—— 实测
$ echo '{"a": 1, "b": [true, null]}' | python -m json
{
"a": 1,
"b": [
true,
null
]
}
# 老方式仍然能用
$ echo '{"a": 1}' | python -m json.tool
实测补充:
python -m json --help在 3.14 上就是usage: python -m json ...(3.13 上显示python -m json.tool ...)——门牌确实换了;- 参数仍是文件名而非字面量:
python -m json "{1, 2, None}"会把它当文件路径(实测报FileNotFoundError),校验字面量请走 stdin 管道; - 常用开关:
--compact、--sort-keys、--json-lines、--indent N; - 按 What's New,3.14 起 JSON CLI 输出默认带颜色高亮(官方文档;终端不支持时自动退化)。
CI 里一行 python -m json --json-lines < events.ndl > /dev/null 就是零成本的 NDJSON 校验器。
2. python -m asyncio pstree:看穿另一个进程的事件循环(3.14)
这是 3.14 最实用的排障工具之一,底层是 PEP 768 安全外调接口:不重启、不停机,打印目标进程的 asyncio 任务树。
目标进程(demo:一个 boss 和三个 worker,各睡 30 秒):
# t_pstree_target.py
import asyncio, os
async def worker(name, delay):
await asyncio.sleep(delay)
async def main():
print("PID", os.getpid(), flush=True)
asyncio.create_task(worker("boss", 30), name="boss")
for i in range(3):
asyncio.create_task(worker(f"w{i}", 30), name=f"worker-{i}")
await asyncio.sleep(30)
asyncio.run(main())
另开一个终端(实测输出,路径已清理):
$ python -m asyncio pstree 21948
└── (T) Task-1
└── main t_pstree_target.py:11
└── sleep Lib/asyncio/tasks.py:702
└── (T) boss
└── worker t_pstree_target.py:4
└── sleep Lib/asyncio/tasks.py:702
└── (T) worker-0
└── worker t_pstree_target.py:4
└── sleep ...
...
每个任务的名字、当前 await 的调用栈(文件:行号)全部可见。"协程卡在哪"这类问题,一行命令定位。配套还有 python -m asyncio ps <pid>(平铺列表视图,官方文档)。
Windows 实测教训:目标是必须真正的 python.exe 进程。如果你的启动方式带了 shell 包装,拿到的 PID 可能是包装进程,会报 Failed to find the PyRuntime section in process ...——换到真实 python 进程的 PID 即可。
3. python -m pdb -p <pid>:attach 上去调试(3.14)
同一个 PEP 768 家族:pdb 支持远程附着一个运行中的进程:
$ python -m pdb -p 1234
3.14 的 pdb 还把默认后端切到了 sys.monitoring(CLI 与 breakpoint() 走 monitoring;手工实例化 pdb.Pdb 仍走 settrace,可配置)——这部分为官方文档表述,我们未单独实测 attach 流程。对线上长驻进程"加个断点看看",这是历史性改善。
4. python -m random:一行随机数,脚本党刚需(3.13)
实测(输出随机,故示意为当时拿到的真实值):
$ python -m random 10 # 1..10 随机整数(等价 -i 10)
6
$ python -m random a b c # 多个字符串即随机选一(等价 -c a b c)
a
$ python -m random -f 5 # 0..5 随机浮点
接口就三件事(-c 选择、-i 整数、-f 浮点),位置参数按类型自动分发。Makefile、CI 脚本、shell 一行流里不用再写 python -c "import random; ..."。
5. python -m inspect:把对象"开膛"给你看(3.13)
语法是 module:qualname(注意冒号,不是点号):
# 打印对象源码 —— 实测(对普通 .py 模块)
$ python -m inspect "sample_mod:add"
def add(a, b):
"""Add two numbers."""
return a + b
# -d 显示模块详情 —— 实测
$ python -m inspect -d "sample_mod"
Target: sample_mod
Origin: .../sample_mod.py
Cached: .../__pycache__/sample_mod.cpython-314.pyc
Loader: <_frozen_importlib_external.SourceFileLoader ...>
两个实测坑:
- 点号整串会被当模块名:
python -m inspect os.path.join报No module named 'os.path.join'——必须用冒号语法os.path:join; - 内建/冻结模块(
os、sys,以及某些把标准库冻结的发行版)没有 Python 源文件,报OSError: could not get source code——这不是 CLI 的 bug。
详读源码、写文档时引用函数签名,这个工具比"打开源码文件"快。
6. argparse:你的 CLI 也该用上新参数(3.14)
import argparse
from pathlib import Path
p = argparse.ArgumentParser(
prog="deploy",
suggest_on_error=True, # 拼错 choices/子命令时给"你是不是想用"建议
color=True, # 彩色帮助输出(3.14)
)
p.add_argument("config", type=Path) # type=Path 原生支持,args.config 是 Path 对象
p.add_argument("--mode", choices=["fast", "slow"])
args = p.parse_args(["cfg.ini", "--mode", "fats"])
# error: argument --mode: invalid choice: 'fats', maybe you meant 'fast'? —— 实测
实测过的边界:suggest_on_error 对 choices 拼错和子命令名拼错给建议;对完全未知的 --flag 只报 unrecognized arguments,不给建议。另外 exit_on_error=False 可以让 parse 抛 ArgumentError 而不是直接退出——写测试和嵌套 CLI 时好用(实测)。
7. 老朋友们的现代形态(速查)
| 需求 | 现代写法 | 备注 |
|---|---|---|
| JSON 校验/格式化 | python -m json(3.14) |
json.tool 软弃用 |
| 微基准 | python -m timeit -s "import json" "json.dumps({})" |
老而弥坚 |
| asyncio 排障 | python -m asyncio pstree <pid>(3.14) |
PEP 768 |
| 远程调试 | python -m pdb -p <pid>(3.14) |
PEP 768 |
| 随机数 | python -m random choice/int/shuffle(3.13) |
|
| 自省 | python -m inspect "mod:qualname"(3.13) |
注意冒号语法 |
| HTTP 服务 | python -m http.server 8000 --directory . |
老命令 |
| zip 打包应用 | python -m zipapp |
老命令 |
一条通用提醒:这些 CLI 都是"零依赖、开箱即用"的——在受限环境(客户机器、容器救援、CI 诊断)里,它们比"先 pip install 一堆"可靠得多。
验证环境:Windows 11 x64;CPython 3.13.15 与 3.14.0(python-build-standalone,uv 安装)。标"实测"的命令与输出均于 2026-09-28 真实执行(随机类工具输出为示意形式);
python -m pdb -p、asyncio ps、JSON 输出配色、argparsecolor等项为官方文档表述,未逐项实测,已在文中注明。引自 docs.python.org 与 What's New 的内容以官方为准。