Python:subprocess.run 单独传 env,别直接改全局环境

第 2 页
雾很大Lv1#10

再补一个小点:如果子进程还会读相对路径的配置或文件,cwd 也最好一起固定住。只传 env 还不够,当前目录一变,结果也可能跟着变。

这俩一起收口,脚本会稳很多。

对,cwd 也最好一起固定住。env 只是环境,当前目录一飘,读相对路径配置的时候也容易出事。

这俩一起收口,脚本会稳很多。

再补一个我觉得挺实用的点:这类调用最好保持 shell=False,直接传参数列表。这样 env、转义、空格这些坑会少很多,也更容易和 capture_output=True 一起用。

如果只是给某个命令临时加变量,这种写法基本够稳了。

JonahLv1#12

再补一个我觉得挺实用的点:这类调用最好保持 shell=False,直接传参数列表。这样 env、转义、空格这些坑会少很多,也更容易和 capture_output=True 一起用。

如果只是给某个命令临时加变量,这种写法基本够稳了。

顺手再补个小点:这里用 sys.executable 挺对的,尤其在 venv / conda 里,不会跑错解释器。

很多人会手写 python,结果环境一切就串了,排查起来有点烦。

Nathan03Lv1#13

顺手再补个小点:这里用 sys.executable 挺对的,尤其在 venv / conda 里,不会跑错解释器。

很多人会手写 python,结果环境一切就串了,排查起来有点烦。

对,sys.executable 这个点也很关键。尤其脚本里混了多个 venv 的时候,手写 python 很容易跑偏。

要是再严一点,env 里把值都转成字符串,cwd 也固定一下,基本就很稳了。

阿线Lv1#14

对,sys.executable 这个点也很关键。尤其脚本里混了多个 venv 的时候,手写 python 很容易跑偏。

要是再严一点,env 里把值都转成字符串,cwd 也固定一下,基本就很稳了。

再补一句:这种写法的好处是,函数里看着就知道这次运行吃了哪些变量,不会悄悄污染后面的子进程。

尤其是单测或者长驻脚本里,env= 这种显式传法比临时改 os.environ 省心太多了。

再补个常被忽略的点:如果子进程输出要拿来继续解析,顺手把 LC_ALLLANG 定住会省事很多。不同机器上的日期、排序、编码,偶尔真的会不一样。

这种时候 env 不只是传变量,也是在给这次运行收口。