微信号:gh_f3f87778cda3

介绍:专注基于python的运维技术经验分享

windows添加python环境变量脚本

2016-03-13 22:36 python运维技术

在windows上安装过python的朋友都知道,python安装完毕后,默认是不能直接运行的,如果你在cmd窗口输入python,会提示: “python”不是内部或外部命令,也不是可运行的程序或批处理文件。这时需要我们手动添加python运行的环境变量,找到系统变量按钮,找到path,然后添加等,这是我们一般的做法,但今天我们所说的是如何用脚本的方式去实现添加环境变量,我们来看脚本:


import sys

import os

import time

import _winreg

import ctypes


def extend(pypath):

    hKey = _winreg.OpenKey (_winreg.HKEY_LOCAL_MACHINE, 

               r'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', 

               0, _winreg.KEY_READ | _winreg.KEY_SET_VALUE)

    

    value, typ = _winreg.QueryValueEx (hKey, "PATH")

    vals = value.split(';')

    assert isinstance(vals, list)

    if len(sys.argv) > 1 and sys.argv[1] == 'remove':

        try:

            vals.remove(pypath)

        except ValueError:

            print 'path element', pypath, 'not found'

            return

        print 'removing from PATH:', pypath

    else:

        if pypath in vals:

            print 'path element', pypath, 'already in PATH'

            return

        vals.append(pypath)

        print 'adding to PATH:', pypath

    _winreg.SetValueEx(hKey, "PATH", 0, typ, ';'.join(vals) )

    _winreg.FlushKey(hKey)

    # notify other programs

    SendMessage = ctypes.windll.user32.SendMessageW

    HWND_BROADCAST = 0xFFFF

    WM_SETTINGCHANGE = 0x1A

    SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, u'Environment')


    

def find_python():

      hKey = _winreg.OpenKey(_winreg.HKEY_CLASSES_ROOT, 

                           r'Python.File\shell\open\command') 

    # get the default value

    value, typ = _winreg.QueryValueEx (hKey, None)

    program = value.split('"')[1]

    if not program.lower().endswith(r'\python.exe'):

        return None

    return os.path.dirname(program)

    

pypath=find_python()

extend(pypath)


脚本解释,前几行是导入用到的模块,其中_winreg模块是操作windows注册表的用的,ctypes模块用来调用windows接口;然后是两个函数extend()函数如果没参数是加入python环境变量,如果加入remove参数,将代表移除python环境变量,其中 SendMessage = ctypes.windll.user32.SendMessageW这行解释下,windll就是动态连接库加载对象,user32是Windows提供的WIN32的API接口的动态连接库的名称,MessageBoxW是WIN32提供的弹出一个提示框的函数名称;find_python()函数是返回python路径,最后是先用find_python()函数找出python的路径,然后调用extend()函数进行加入。



 
python运维技术 更多文章 Django模型1对多和多对多关系 用gunicorn搭建flask运行环境 基于AWS的游戏自动化运维部署 aws s3上传大文件的4种方法 python产生随机密码
猜您喜欢 Android Gradle 技巧之一: Build Variant 相关 vi和Vim的读音 接口请求利器之Postman 北京Android N开发者会议见闻 谈谈分类器的损失函数(2)