1、部分环境变量字段需要保留原来的值,只是做添加,不可以替换

2、Path和PATH对于python来说是一样的,也就是说存在名为Path的环境变量时,添加PATH的环境变量,会覆盖原有的Path环境变量,需要做判断

3、java_home之类的home路径,若原先已存在路径,哪怕已添加路径,系统也只会从第一个路径查找,而不是新添加的路径查找

4、java安装后配置环境变量时,要注意环境变量是配置在哪个用户下面,所有用户公用的是SYSTEM用户的环境变量

5、设定安装路径时,使用C:\而不是C:\\,否则安装后由于tomcat或java的path为C:\\java之类的,导致系统报错

The JAVA_HOME environment variable is not defined correctly
This environment variable is needed to run this program
NB: JAVA_HOME should point to a JDK not a JRE
这个报错也可能是windows的本地环境与远程执行环境不同导致的,为了方便,全部用python调用底层api去运行程序或进程或服务,在运行的bat开头set环境变量,然后解决了

代码如下:

# coding=utf8
import os
import sys
from subprocess import check_call if sys.hexversion > 0x03000000:
import winreg
else:
import _winreg as winreg
import subprocess def run_cmd(cmd, cwd=None, runas=None):
u"""
运行cmd命令。
"""
if not sys.platform.startswith('win') and runas and runas != 'root':
cmd = 'su - {} -c "{}"'.format(runas, cmd)
# logger.info(cmd)
proc = subprocess.Popen(cmd,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
shell=True,
cwd=cwd)
return proc def get_output(cmd, cwd=None, wait=True, runas=None):
u"""
获得命令执行后的标准输出或错误输出。
"""
proc = run_cmd(cmd, cwd=cwd, runas=runas)
lines = []
if wait:
while proc.poll() is None:
if proc.stdout:
lines.extend(proc.stdout.readlines())
lines.extend(proc.stdout.readlines())
return lines class Win32Environment:
"""Utility class to get/set windows environment variable""" def __init__(self, scope):
# assert scope in ('user', 'system')
self.scope = scope
if scope == 'user':
self.root = winreg.HKEY_CURRENT_USER
self.subkey = 'Environment'
else:
self.root = winreg.HKEY_LOCAL_MACHINE
self.subkey = r'SYSTEM\CurrentControlSet\Control\Session Manager\Environment' def search(self, name):
key = winreg.OpenKey(self.root, self.subkey, 0, winreg.KEY_READ)
key_value = ''
try:
i = 0
while i >= 0:
key_value, path, value = winreg.EnumValue(key, i)
i += 1
if key_value == name:
break
except:
key_value = ''
return key_value def getenv(self, name):
key = winreg.OpenKey(self.root, self.subkey, 0, winreg.KEY_READ)
try:
value, _ = winreg.QueryValueEx(key, name)
except:
value = ''
return value def setenv(self, name, value):
# Note: for 'system' scope, you must run this as Administrator
key = winreg.OpenKey(self.root, self.subkey, 0, winreg.KEY_ALL_ACCESS)
winreg.SetValueEx(key, name, 0, winreg.REG_EXPAND_SZ, value)
winreg.CloseKey(key)
# For some strange reason, calling SendMessage from the current process
# doesn't propagate environment changes at all.
# TODO: handle CalledProcessError (for assert)
check_call(
'''\"%s" -c "import win32api, win32con;assert win32api.SendMessage(win32con.HWND_BROADCAST, win32con.WM_SETTINGCHANGE,0, 'Environment')"''' % sys.executable) def get_userenv(self, name):
# Note: for 'system' scope, you must run this as Administrator
key = winreg.OpenKey(self.root, self.subkey, 0, winreg.KEY_ALL_ACCESS)
value, _ = winreg.QueryValueEx(key, name)
return value def set_env_path(env_obj, env_name, env_path,refresh=False):
need_add = False
path_values = None
exist_path = None
if env_obj.search(env_name):
exist_path = env_obj.get_userenv(env_name)
if not exist_path and env_obj.search(env_name.upper()):
exist_path = env_obj.get_userenv(env_name.upper()) if refresh:
exist_path=None
if exist_path:
path_values = [i for i in exist_path.split(';')]
for i in env_path.split(';'):
if i not in path_values:
path_values.append(i)
need_add = True
if not need_add and path_values:
return '已添加环境变量{}:{}'.format(env_name, exist_path) if path_values:
env_path = ';'.join(path_values) env_obj.setenv(env_name, os.path.expanduser(env_path))
path_value = env_obj.get_userenv(env_name)
return '已添加环境变量{}:{}'.format(env_name, path_value) if __name__ == '__main__':
env_obj = Win32Environment(scope="SYSTEM")
print set_env_path(env_obj, 'JAVA_HOME', java_home,refresh=True) print set_env_path(env_obj, 'Path', '%JAVA_HOME%\\bin;%JAVA_HOME%\\jre\\bin') print set_env_path(env_obj, 'CLASSPATH',
'.;%JAVA_HOME%\\lib\\dt.jar;%JAVA_HOME%\\lib\\tools.jar')

  

windows环境用python修改环境变量的注意点(含代码)的更多相关文章

  1. Windows 下 Django/python 开发环境配置

    1.安装 Aptana/Eclipse Aptana是在eclipse上二次开发的一个开源的集成开发环境,内置python编译器 http://www.aptana.com/ 2. 安装python ...

  2. windows下安装python、环境设置、多python版本的切换、pyserial与多版本python安装、windows命令行下切换目录

    1.windows下安装python 官网下载安装即可 2.安装后的环境设置 我的电脑--属性--高级--设置path的地方添加python安装目录,如C:\Python27;C:\Python33 ...

  3. linux python 修改环境变量 添加自定义模块路径

    举一个很简单的例子,如果你发现一个包或者模块,明明是有的,但是会发生这样的错误: >>> from algorithm import *Traceback (most recent ...

  4. windows下的python flask环境搭建

    在Windows中搭建flask框架分为如下几步 1. 下载ez_setup.py文件,然后在cmd中执行 链接:http://pan.baidu.com/s/1qXOSeHu 密码:jkbw pyt ...

  5. 【转】Windows下selenium+python自动化测试环境搭建

    原文链接:http://www.cnblogs.com/test-of-philosophy/articles/4322918.html 搭建平台:windows 1.安装python,下载地址:ht ...

  6. windows系统的python开发环境的搭建

    step1:  访问python官方网站下载python安装包 https://www.python.org/downloads/windows/ 下载自己想要的版本 勾上Add Python XX ...

  7. windows下切换Python运行环境。

    1.首先确保你的系统里已经安装了Conda,打开命令行窗口,执行命令:conda --version 2.查看你的系统当前已有的Python环境,执行命令:conda info --envs,从图中我 ...

  8. windows下,python+scrapy环境搭建

    •安装lxml(官网给出的地址http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml,下载whl文件安装) •安装zope.interface https:// ...

  9. windows下搭建python+selenium环境

    1.安装python https://www.python.org/ 2.安装setuptools(python的基础包工具) 下载地址:https://pypi.python.org/pypi/se ...

随机推荐

  1. 【转】stm32CubeMx上移植自己的printf()和scanf()函数

    要想printf()和scanf() 函数工作,我们需要把printf()和scanf() 重新定向到串口中.重定向是指用户可以自己重写C 的库函数,当连接器检查到用户编写了与C 库函数相同名字的函数 ...

  2. 「THUSCH 2017」大魔法师 解题报告

    「THUSCH 2017」大魔法师 狗体面太长,帖链接了 思路,维护一个\(1\times 4\)的答案向量表示\(A,B,C,len\),最后一个表示线段树上区间长度,然后每次的操作都有一个转移矩阵 ...

  3. python2和python3的主要区别

    作为一个py3土著,并不是很关心这个问题,但是总有人隔三差五问这个问题,还是捋了一下. 这里列出几个主要区别: 1.最常见的人尽皆知的print()函数 在py2中,print是一个语句,不带括号,也 ...

  4. CF1043

    找个下午打了场CF,结果被某uranus吊打......一千多名,过弱. T1,一眼二分了,后来发现题解是O(1)的hhh T2,题意精炼一下就是让你找一个串的循环节个数,直接n²枚举..... T3 ...

  5. 【POJ1741】Tree

    题目大意:给定一棵 N 个节点的无根树,边有边权,统计树上边权和不大于 K 的路径数. 对于每条树上路径,对于每一个点来说,该路径只有经过该点和不经过该点两种情况,对于不经过该点的情况,可以转化成是否 ...

  6. activeMQ点对点

    摘要: ActiveMQ 点对点消息 Point-to-Point 是一对一 创建消息生产者 /**  * 点对点消息生产者  *   * @author Edward  *   */ public  ...

  7. 线程的同步(协调)synchronized

    [格式] 同步代码块:synchronized(Object){...} 关键字在代码块前,每次只允许一个线程调用此代码块. Object为任何对象(一般用this),每个对象都有一个标志位(0锁住状 ...

  8. SQL Server 2008以上误操作数据库恢复方法——日志尾部备份

    原文出处:http://blog.csdn.net/dba_huangzj/article/details/8491327 问题: 经常看到有人误删数据,或者误操作,特别是update和delete的 ...

  9. MyEclipse导入Maven项目以及Maven转化为Dynamic Web Module(转)

    MyEclipse导入Maven项目(这个博主写的比较详细)https://blog.csdn.net/w12345_ww/article/details/52094756 Maven转化为Dynam ...

  10. 到浏览器顶部的获取js和jquery

    获取当前窗口到页面顶端高度: js: document.documentElement.scrollTop JQ:$(document).scrollTop()或者$(window).scrollTo ...