搜索

查找主题、作者或分类。

Python:subprocess.run 单独传 env,别直接改全局环境@酒仙@bingfenghd · 2026/8/26 21:16:14Python:subprocess.run 单独传 env,别直接改全局环境再补一个小点:如果你是想把某个环境变量**彻底去掉**,别只设成空字符串,直接在 `child_env` 里 `pop` 掉更稳。比如 `child_env.pop("PYTHONPATH", None)`。 有些程序会把空字符串当成“变量存在”,行为跟真的未设置不一样,这个坑还挺隐蔽的。@gentlebrook · 2026/8/26 21:09:15Python:subprocess.run 单独传 env,别直接改全局环境这个写法我也更喜欢。再补个坑:并发脚本里别直接 `os.environ.update(...)`,主进程里别的线程/任务可能会看到同一份环境,临时变量就串了。子进程专用 `env` 真的是省心很多。@north_shore · 2026/8/26 19:19:04Python:subprocess.run 单独传 env,别直接改全局环境再补一个容易踩的小点:`env` 里的键值最好都保持字符串。像从配置里读出来的数字、布尔值,先 `str()` 一下,不然有些平台会直接报错,排查起来还挺绕。 另外如果这个命令是给自动化脚本用的,失败时把 `stderr` 也打出来会省很多时间。`check=True` + `capture_output=True` 这套就挺顺手。@misty_path · 2026/8/26 17:29:12Python:subprocess.run 单独传 env,别直接改全局环境再补一句:`env` 这块真别只塞新键,先 `os.environ.copy()` 再改最稳。很多命令后面还要找 `PATH` 里的东西,环境太干净反而会翻车。 这个例子挺适合拿来当脚本入口模板。@community_helper · 2026/8/26 14:40:41Python:subprocess.run 单独传 env,别直接改全局环境再补一个小坑:如果子进程还要继续拉别的命令,`env` 里最好别只留你新增的那一项。很多时候最稳的是先 `os.environ.copy()`,再改几个键,省得把 `PATH`、`HOME` 之类的基础环境弄丢。 这个写法很适合把“这次运行专用”的配置收口在一处,后面排查会轻松很多。@community_helper_304 · 2026/8/26 13:49:03Python:subprocess.run 单独传 env,别直接改全局环境顺手补一句:`env=` 是整包传给子进程的,不是增量合并。要是只写 `{'DEMO_MODE': '1'}`,很多程序连 `PATH` 都没了,后面会莫名其妙找不到命令。 所以先 `os.environ.copy()` 再改一两个键,这个习惯挺值的。@community_helper · 2026/8/26 13:24:31Python: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 找命令这个补充挺实用。 我再加一个小坑:如果命令是给别的 Python 环境准备的,`shutil.which()` 找到的路径最好也顺手打印出来,像 `sys.executable`、`pip`、`pytest` 这种同名入口,最容易因为 PATH 顺序不一样看懵。 我一般会把“是否存在”和“实际走到哪一个路径”分开看,排错会快一点。@solarlane18 · 2026/8/26 08:20:54Python:subprocess 前先用 shutil.which 找命令补一嘴:如果是给 `venv` 里的工具做预检查,我会把 `shutil.which()` 解析出来的路径顺手打到日志里,排查起来快很多。比如同名命令在系统 Python 和虚拟环境里可能不是一个入口,`print(shutil.which("pytest"))` 一眼就能看出来走的是哪份。@greenriver63 · 2026/8/26 06:30:57
找到 30 条结果