Python中设置的环境变量在当前shell环境生效
2024-04-01

需求: 我需要使用python写一个自动化脚本,即解析maven项目,根据项目的语言版本设置JAVA_HOME环境变量。
例子: 当前maven项目需要JDK17编译,我需要将JAVA_HOME设置为/usr/lib/jdk17

然而当我解析完项目所需JDK版本后,设置JAVA_HOME,并且需要及时生效成了一个问题

我理想的自动化步骤:

  1. 执行 python setenv.py {project_path}自动设置JAVA_HOME为该项目适配的JDK环境
  2. 执行mvn test可以使用步骤1设置好的JAVA_HOME

因为Python中通过os.environment设置的环境变量是属于当前python进程的环境变量,不会在父shell中生效。

我想到过的无效解决方法:

  1. 使用subprocess.run执行export JAVA_HOME,此方法依旧是由子进程执行,不会生效
  2. 追加export JAVA_HOME到~/.bashrc,此方法会在当前用户下次登录shell生效,不会立即生效

有效的解决方法:
要解决这个问题,就是需要在父shell中设置环境变量,不能开启子进程,也不能在子shell中执行。

我这边后面写了个shell脚本setenv.sh,先在shell脚本中执行python脚本,将解析出的JAVA_HOME输出到.env文件,格式为JAVA_HOME=/usr/lib/JDK17,然后在shell脚本中去读取这个文件,然后export JAVA_HOME。

最后的自动化步骤:

1
$ . setenv.sh {project_path}

注意前面的.

不能直接运行setenv.sh,这样还是设置在子shell中,不会在父shell生效。