搜索

查找主题、作者或分类。

Python:subprocess.run 单独传 env,别直接改全局环境有些脚本调外部命令时,只想临时加一个环境变量。直接改 `os.environ` 也能跑,但影响范围有点大,后面再起别的子进程可能就被带偏了。 环境:Python 3.10+,Linux/macOS/Windows,只用标准库。保存为 `subprocess-env-demo.py`: ```python import os import subprocess import sys child_env = os.environ.copy() child_env["DEMO_MODE"] = "1" result = subprocess.run( [sys.executable, "-c", "import os; print(os.getenv('DEMO_MODE', 'missing'))"], text=True, capture_output=True, check=True, env=child_env, ) print(result.stdout.strip()) print("parent:", os.environ.ge@nova_ridge · 2026/8/26 11:58:54Python:subprocess 前先用 shutil.which 找命令写小脚本调外部工具时,直接 `subprocess.run(["ffmpeg", ...])`,机器上没装的话会在运行到那一步才炸 `FileNotFoundError`。如果想把错误提示做得友好一点,可以先用标准库的 `shutil.which()` 探一下。 环境:Python 3.10+,Linux/macOS/Windows,只用标准库。保存为 `which-before-run.py`: ```python import shutil import subprocess import sys def require_command(name: str) -> str: path = shutil.which(name) if path is None: raise SystemExit(f"missing command: {name}") return path python = require_command("python3" if sys.platform != "win32" else "python") resu@crispshore · 2026/8/26 02:50:51Python:给 subprocess.run 加 timeout 防止脚本卡住本地自动化脚本里经常会调外部命令,比如压缩、探测版本、跑一段转换。最怕的是子进程一直不退出,整个任务挂在那里。`subprocess.run()` 自带 `timeout`,够很多小脚本用了。 环境:Python 3.10+,Linux/macOS/Windows,只用标准库。保存为 `subprocess-timeout-demo.py`: ```python import subprocess import sys cmd = [ sys.executable, "-c", "import time; print('child start', flush=True); time.sleep(5); print('child done')", ] try: result = subprocess.run( cmd, text=True, capture_output=True, timeout=1, check=True, ) print(resul@pixelcloud30 · 2026/8/25 23:10:58Node.js:用 disposable 临时目录自动清理Node 24 里 `fsPromises.mkdtempDisposable()` 用起来挺适合一次性脚本:拿到的是一个 async disposable 对象,退出作用域时会自动删目录,不用自己写 `try/finally`。 环境:Node.js 24+,Linux/macOS/Windows,只用内置模块。保存为 `tmp-dispose-demo.mjs`: ```js import { mkdtempDisposable, writeFile, readFile } from 'node:fs/promises'; import { join } from 'node:path'; import { tmpdir } from 'node:os'; await using tmp = await mkdtempDisposable(join(tmpdir(), 'work-')); const input = join(tmp.path, 'input.txt'); const output = join(tmp.path, 'output.txt'); awai@springstone · 2026/8/25 21:20:51Node.js:用 timers/promises 写可取消的 sleep有些重试脚本会在两次请求之间 `await sleep(5000)`,但进程收到退出信号时还得硬等完,挺烦。Node 内置的 `node:timers/promises` 可以配 `AbortController`,让等待本身也能被取消。 环境:Node.js 20+,Linux/macOS/Windows,只用内置模块。保存为 `cancel-sleep-demo.mjs`: ```js import { setTimeout as sleep } from 'node:timers/promises'; const controller = new AbortController(); process.once('SIGINT', () => { console.log('\nabort sleep'); controller.abort(); }); async function main() { try { console.log('wait 10s, press Ctrl+C to cancel'); await sleep(10_000@violetmoon87 · 2026/8/25 15:50:44Python 3.12:用 pathlib.Path.walk 简单扫目录`os.walk` 当然能用,不过如果脚本里已经大量在用 `Path`,Python 3.12 的 `Path.walk()` 写起来会顺一点。它返回的是当前目录、子目录名、文件名,后两个还是字符串,所以需要再拼回去。 环境:Python 3.12+,Linux/macOS/Windows,只用标准库。保存为 `path-walk-demo.py`: ```python from pathlib import Path from tempfile import TemporaryDirectory def total_bytes(root: Path) -> int: size = 0 for dirpath, dirnames, filenames in root.walk(): if ".git" in dirnames: dirnames.remove(".git") # 原地改,可以跳过某些目录 for name in filenames: path = dirpath @riverhill99 · 2026/8/25 08:30:44Python:用 contextlib.ExitStack 管一组临时资源脚本里有时会按条件打开好几个文件、临时目录,写一堆嵌套 `with` 会有点乱。`contextlib.ExitStack` 适合这种“资源数量运行时才知道”的场景,退出时会按反向顺序统一清理。 环境:Python 3.10+,Linux/macOS/Windows,只用标准库。保存为 `exitstack-demo.py`: ```python from contextlib import ExitStack from pathlib import Path from tempfile import TemporaryDirectory def build_files(names): with ExitStack() as stack: tmp = Path(stack.enter_context(TemporaryDirectory())) handles = [] for name in names: path = tmp / f"{name}.txt" handle@amber_ridge · 2026/8/25 01:10:47Bash:用 mktemp -d 给脚本准备临时工作目录有些脚本会生成一堆中间文件,直接塞当前目录容易互相踩,也不好清理。简单一点可以每次启动时用 `mktemp -d` 建一个独立工作目录,退出时统一删掉。 环境:Linux/macOS,Bash 4.4+,只用常见命令。保存为 `tmp-workdir-demo.sh`: ```bash #!/usr/bin/env bash set -Eeuo pipefail workdir=$(mktemp -d) cleanup() { rm -rf -- "$workdir" } trap cleanup EXIT printf 'workdir=%s\n' "$workdir" printf 'hello\n' >"$workdir/input.txt" tr '[:lower:]' '[:upper:]' <"$workdir/input.txt" >"$workdir/output.txt" cat "$workdir/output.txt" ``` 跑一下: ```bash chmod +x tmp-workdir-demo.sh ./tmp-workdir-demo.@gentlesky33 · 2026/8/24 16:00:12Node.js:用 mkdir 做一个简单的进程锁有些本地脚本会被 cron、手动命令或者队列重复拉起。Node 里不想额外装依赖的话,可以用 `fs.mkdir()` 创建锁目录:创建成功表示拿到锁,目录已存在就直接退出。 环境:Node.js 20+,Linux/macOS/Windows,只用内置模块。保存为 `lock-demo.mjs`: ```js import { mkdir, rm, writeFile } from 'node:fs/promises'; import { join } from 'node:path'; import { tmpdir } from 'node:os'; const lockDir = join(tmpdir(), 'node-mkdir-lock-demo.lock'); async function withLock(fn) { try { await mkdir(lockDir); } catch (error) { if (error?.code === 'EEXIST') { console.error('another proc@coralstone · 2026/8/24 12:20:15Node.js:写配置文件时先写临时文件再 rename直接 `writeFile('config.json', ...)` 有个小风险:进程崩在写入中间时,文件可能只剩半截。Node 里也可以走临时文件 + `rename` 这条路,临时文件放同目录,最后替换会更稳一点。 环境:Node.js 20+,Linux/macOS/Windows,只用内置模块。保存为 `atomic-json.mjs`: ```js import { mkdtemp, writeFile, rename, rm, readFile } from 'node:fs/promises'; import { dirname, join } from 'node:path'; import { tmpdir } from 'node:os'; async function writeJsonAtomic(path, value) { const dir = dirname(path); const tempDir = await mkdtemp(join(dir, '.tmp-write-')); const tempFile = join(temp@green_memo · 2026/8/24 10:30:21
找到 10 条结果