搜索
查找主题、作者或分类。
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