python 设置环境变量

作者:小醉
链接:https://www.zhihu.com/question/53235092/answer/236439018
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本人进行如下测试,os.putenv()会在当前窗口下生效。

1、os.environ['']=''(不生效)

import os
import commands

os.environ['JAVA_HOME']
os.environ['JRE_HOME']
os.environ['PATH']
os.environ['CLASSPATH']

print commands.getoutput('java -version')

JAVA_HOME="/usr/local/jdk1.6.0_25"
JRE_HOME="%s/jre"%JAVA_HOME
PATH=os.environ['PATH']
PATH="%s/bin:%s/bin:%s"%(JAVA_HOME,JRE_HOME,PATH)
CLASSPATH=".:%s/lib/:%s/lib/"%(JAVA_HOME,JRE_HOME)

d={'JAVA_HOME':JAVA_HOME,
'JRE_HOME':JRE_HOME,
'PATH':PATH,
'CLASSPATH':CLASSPATH}
os.environ=dict(os.environ.items() + d.items())

os.environ['JAVA_HOME']
os.environ['JRE_HOME']
os.environ['PATH']
os.environ['CLASSPATH']

print commands.getoutput('java -version')

2、os.putenv('','')(生效)

import os
import commands

os.environ['JAVA_HOME']
os.environ['JRE_HOME']
os.environ['PATH']
os.environ['CLASSPATH']

print commands.getoutput('java -version')

JAVA_HOME="/usr/local/jdk1.6.0_25"
JRE_HOME="%s/jre"%JAVA_HOME
PATH=os.environ['PATH']
PATH="%s/bin:%s/bin:%s"%(JAVA_HOME,JRE_HOME,PATH)
CLASSPATH=".:%s/lib/:%s/lib/"%(JAVA_HOME,JRE_HOME)

os.putenv('PATH','%s'%PATH)

print commands.getoutput('java -version')

另外一些研究:

ssh-agent, dircolors 等已经为我们提供了思路:把设置环境变量的 shell 命令写到标准输出。

所以 getenv.py 如下:

#!/usr/bin/env python2
try:  # py3
    from shlex import quote
except ImportError:  # py2
    from pipes import quote

path = '/TOOLS/Caden/linux/X64/ even spaces '
print('export MYDATA={}'.format(quote(path)))

然后

eval $(./getenv.py) && echo $MYDATA
  1. 写/etc/profile /etc/environment之类的配置文件然后重启
  2. 从你的管理进程(你能控制环境变量的那个进程)启动,子进程会继承父进程的环境变量,但是没有标准的方法(或者说我不知道)更改父进程和父进程开始的其他子进程的环境变量

请参考
1、修改 ~/.bashrc文件

2、添加 export PATH=/usr/local/****/bin:$PATH
3、在终端运行 source ~/.bashrc

试试这样,将上面的写成.sh 脚本,再用subprocess 模块中的方法调用这个sh脚本。

请参考
1、修改 ~/.bashrc文件

2、添加 export PATH=/usr/local/****/bin:$PATH
3、在终端运行 source ~/.bashrc

试试这样,将上面的写成.sh 脚本,再用subprocess 模块中的方法调用这个sh脚本。

编辑于 2016-12-02

知乎用户

知乎用户

通信IC码农

目前好想没有直接能够用python改变当前shell环境变量的方法

python处理逻辑比较方便,但是修改环境变量只能在python脚步的子进程当中生效,并不能在shell进程生效。

所以目前我自己用的一种比较dirty的方法是:

复杂的逻辑部分交给python脚本实现,

#!/bin/env python
import os
import sys
.....
复杂的逻辑处理,
比如在不同的项目目录下设置不同的环境变量
.....
最后将这些设置保持到临时文件"._py_env_cfg"

shell 脚本只负责简单的source(环境变量会在当前shell生效)

#!/bin/csh
python  env_gen.py    #生成临时配置文件"._py_env_cfg"
source  ._py_env_cfg  #source 
rm ._py_env_cfg       #删除临时文件

本质上是python 子进程向父进程shell 通过文件方式通信。

如果找到更优雅的通信方法请告诉我

发布于 2017-08-20

Cosmia Fu

Cosmia Fu

会写Python的Haskell原教旨主义恐怖分子

  1. 写/etc/profile /etc/environment之类的配置文件然后重启
  2. 从你的管理进程(你能控制环境变量的那个进程)启动,子进程会继承父进程的环境变量,但是没有标准的方法(或者说我不知道)更改父进程和父进程开始的其他子进程的环境变量

猜你喜欢

转载自my.oschina.net/activehealth/blog/1797311