作者:小醉
链接: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
- 写/etc/profile /etc/environment之类的配置文件然后重启
- 从你的管理进程(你能控制环境变量的那个进程)启动,子进程会继承父进程的环境变量,但是没有标准的方法(或者说我不知道)更改父进程和父进程开始的其他子进程的环境变量
请参考
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脚本。
知乎用户
通信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 通过文件方式通信。
如果找到更优雅的通信方法请告诉我
会写Python的Haskell原教旨主义恐怖分子
- 写/etc/profile /etc/environment之类的配置文件然后重启
- 从你的管理进程(你能控制环境变量的那个进程)启动,子进程会继承父进程的环境变量,但是没有标准的方法(或者说我不知道)更改父进程和父进程开始的其他子进程的环境变量