一键部署Python环境脚本

Zss 发表于:

帮同事安装环境时其实每次部署的这些Python的环境挺简单的,但是很多都是重复性的工作

有时候自己在新的电脑中安装也需要重复的操作,这些操作都比较流程化,所以想着那么就使用Python 来写一个脚本打包成exe一键部署吧

1.中间涉及到了一些环境变量的添加,那么我也就需要知道怎么使用命令来给系统添加环境变量  最终多次测试添加环境变量的命令如下:

setx -m PATH "%PATH%;C:\Python27

那么问题来了?我怎么这个python的路径给确定呢?于是想到每次安装的时候默认的路径是系统盘,但是考虑到每个电脑的C盘不一定就是系统盘

所以我得将这个系统盘给找出来,我是用的方法是首先静谧安装Python,安装完了之后,系统盘肯定会有一个PythonXX的文件夹,只需要使用

os.path.exists()来判断这个路径是否存在,如果存在那么这个就是系统盘,那么我再将它加入到环境变量中

那么问题又来了?我怎么去确定我的电脑中有哪些盘符呢?于是我又想到还是用os.path.exists方法来判断,生成二十六个字母,对应的盘符,依次判断

是否存在,存在就加到list中,这样我就得到了我电脑所存在的所有盘符

def install_python():
    drive = []
    print('---> 正在安装Python%s,请稍后...'%versions)
    os.popen('Python%s.msi /qn'%versions)
    for i in range(97,123):
        if os.path.exists('%s:'%chr(i)) == True:
            drive.append(chr(i))
    for i in drive:
        if os.path.exists('%s:\Python%s'%(i,versions)) == True:
            return i.upper()

2.最开始安装时候我的python安装包应当是和脚本在同一个目录的,这样子我只需要去判断当前脚本的工作目录,把他加到环境变量中去

,这样我的msi文件就可以直接通过命令来安装了,而且这在随意的文件夹下面都可以运行,因为当前的工作路径一定会加到环境变量中

def add_work_path():
    pwd_cmd = 'setx -m PATH "%PATH%;{}"'.format(os.getcwd())
    os_info = os.popen(pwd_cmd).read().decode('gbk')
    #print(os_info)
    if '成功'in os_info:
        print('---> 路径:%s 添加成功'%(os.getcwd()))
    else:
        print('---> 路径:%s 添加失败,请使用管理员权限运行'%(os.getcwd()))

3.安装Python包,使用命令来安装且做到自动安装呢??? 查询之后发现msi的文件还是挺好操作的,使用python.msi /qb

/qb 会在窗口中显示一个基本的安装进程。
/qn 参数则不会显示任何窗口,直接在后台自动安装。

为了阻止某些程序安装成功后自动重启动(例如 Kerio Personal Firewall 4),你可以在 /qn 或者 /qb参数后使用REBOOT=Suppress标记

print('---> 正在安装Python%s,请稍后...'%versions)
os.popen('Python%s.msi /qn'%versions)

4.还有一个问题是第三方模块的安装,我决定使用读取配置文件的方法来安装,实际上就是使用的pip来安装的,依次读取ini文件中的各个模块

进行循环的安装

def read_modules():
    modules_list = []
    try:
        with open('modules.ini','r') as f:
            t = f.readlines()
        for i in t:
            modules_list.append(i.strip())
    except:
        print('--->找不到 modules.ini')
    return modules_list
for i in modules_list:
    os.popen('start pip install %s'%(i))
    print('---> 正在安装%s模块,请稍后...'%i)
    time.sleep(3)

5.那么我怎么去判断这个第三方模块安装好了呢???想到pip list这格式可以查看所有的安装好了的第三方模块,将他读取出来,依次将我的安装模块来进行判断,

我需要安装的模块是否存在在这里面,若存在则说明安装好了,不存在则没装好,或者是没装完,这中间和这个资源和网速是有关系的,也不能去判断cmd窗口中的模块是否安装完了

所以我想到了循环的定时来判断模块是否全部装好了,若是败了则再次安装,知道需要安装的list为空了,那么就安装完了

def modules_yesorno(modules_list):
    for i in range(10):
        print('------------------------------------------------------')
        print('              正在检测模块安装是否成功                ')
        time.sleep(60)
        modules_info = os.popen('pip list').read().decode('gbk')
        for i in modules_list:
            if i in modules_info:
                print('---> %s 模块安装成功 --->'%i)
                modules_list.remove(i)
                if modules_list == []:
                    print('---> 恭喜您所有的模块已安装成功!!!')
                    return True
            else:
                print('---> %s 模块安装失败!!!     重新安装中...'%i)
                os.popen('start pip install %s'%i)
        print('------------------------------------------------------')
        for i in modules_list:
            print('--->>> %s模块未完成,请稍后...'%i)
    print('---> %s未安装成功,请考虑网络环境和此模块需要的依赖包'%str(modules_list))
    return True

6.可以扩展的东西其实还是很多的,不如第三方的编辑器安装,和自动化环境webdriver这些的部署环境变量的添加,ride的安装等等

我想我需要的其实只有这么多,不过正式的工作环境中应该还是复很多的,不过理论上来说应该都是可以用脚本来一键部署的

#coding:gbk
import os,sys,time
reload(sys)
sys.setdefaultencoding('gbk')


def add_work_path():
    pwd_cmd = 'setx -m PATH "%PATH%;{}"'.format(os.getcwd())
    os_info = os.popen(pwd_cmd).read().decode('gbk')
    #print(os_info)
    if '成功'in os_info:
        print('---> 路径:%s 添加成功'%(os.getcwd()))
    else:
        print('---> 路径:%s 添加失败,请使用管理员权限运行'%(os.getcwd()))

def add_python_path(drive):
    os_info1 = os.popen('setx -m PATH "%PATH%;{}:\Python{}"'.format(drive,versions)).read().decode('gbk')
    os_info2 = os.popen('setx -m PATH "%PATH%;{}:\Python{}\Scripts"'.format(drive,versions)).read().decode('gbk')
    if '成功'in os_info1:
        print('---> 路径:{}:\Python{} 添加成功'.format(drive,versions))
    if '成功'in os_info2:
        print('---> 路径:{}:\Python{}\Scripts 添加成功'.format(drive,versions))

def install_python():
    drive = []
    print('---> 正在安装Python%s,请稍后...'%versions)
    os.popen('Python%s.msi /qn'%versions)
    for i in range(97,123):
        if os.path.exists('%s:'%chr(i)) == True:
            drive.append(chr(i))
    for i in drive:
        if os.path.exists('%s:\Python%s'%(i,versions)) == True:
            return i.upper()

def read_modules():
    modules_list = []
    try:
        with open('modules.ini','r') as f:
            t = f.readlines()
        for i in t:
            modules_list.append(i.strip())
    except:
        print('--->找不到 modules.ini')
    return modules_list

def modules_yesorno(modules_list):
    for i in range(10):
        print('------------------------------------------------------')
        print('              正在检测模块安装是否成功                ')
        time.sleep(60)
        modules_info = os.popen('pip list').read().decode('gbk')
        for i in modules_list:
            if i in modules_info:
                print('---> %s 模块安装成功 --->'%i)
                modules_list.remove(i)
                if modules_list == []:
                    print('---> 恭喜您所有的模块已安装成功!!!')
                    return True
            else:
                print('---> %s 模块安装失败!!!     重新安装中...'%i)
                os.popen('start pip install %s'%i)
        print('------------------------------------------------------')
        for i in modules_list:
            print('--->>> %s模块未完成,请稍后...'%i)
    print('---> %s未安装成功,请考虑网络环境和此模块需要的依赖包'%str(modules_list))
    return True


if __name__ == '__main__':
    print('------------------------------------------------------')
    print('╭╮ ╭☆╭──╮╭╮   ☆╮   ╭───╮╭╮')
    print('││ │││╭─★││   ││   ★╭─╮│││╮')
    print('│╰─╯││╰╮ ││   ││   ││ ││││')
    print('│╭─╮││╭╯ ││   ││   ││ ││╰╯ ')
    print('││ │││╰─╮│╰──╮│╰──╮│╰─╯│ 〇')
    print('╰★ ╰╯╰──╯☆───╯★───╯╰───☆  ★')
    print('                Python一键安装环境                  ')
    print('------------------------------------------------------')
    versions = raw_input('---> 请输入安装的Python版本号 例如:27或者34\n')
    add_work_path()
    drive = install_python()
    add_python_path(drive)
    modules_list = read_modules()
    print('------------------------------------------------------')
    for i in modules_list:
        os.popen('start pip install %s'%(i))
        print('---> 正在安装%s模块,请稍后...'%i)
        time.sleep(3)
    modules_yesorno(modules_list)
    raw_input('--------------------  回车结束  ----------------------')