Python运行脚本前,自动安装需要的模块包

在部署Python程序时,往往需要先安装很多需要的模块包。如果一个一个安装就会出现忘记的情况,或者新增加某个新的模块时,也可能会忘记安装。如果程序引用模块失败,能自动安装模块就最好了。下面,将讲解python引用模块失败后,如何实现自动安装模块。

Python自动安装模块思路大概如下:

1、列举需要引用的所有模块名(库)

把需要引用的模块用字典记录下来(默认所有模块都未安装),记录方式如下:

'''字典={库名: 安装情况}0未安装,1已安装'''dict_pkg_name = {'pyecharts': '0',  # 可视化图表库                 'pandas': '0',     # 数据处理库                 'echarts-countries-pypkg': '0',          # 全球国家地图-地图包                 'echarts-cities-pypkg': '0',             # 全球城市地图-地图包                 'echarts-china-provinces-pypkg': '0',    # 中国省级地图-地图包                 'echarts-china-cities-pypkg': '0',       # 中国市级地图-地图包                 'echarts-china-counties-pypkg': '0',     # 城市地图-地图包                 'echarts-china-misc-pypkg': '0',         # 未知地图-地图包                 'echarts-united-kingdom-pypkg': '0',     # 未知地图-地图包                 'output_file': '0',  # 图表输出                 '--upgrade pip': '0'  # 更新包 # pip install --upgrade package_name                 }

2、列举常用的镜像源地址

如果模块引用失败,需到对应的镜像源地址下载,有时网络环境不同,可能某个镜像源地址连接超时,无法下载,这时就需要到其他镜像源地址进行下载了。(如本人电脑在OA内网下就无法直接用“pip install 库名”方式进行安装)。故把一些常用的镜像源地址用字典记录下来,如:

# 国内镜像源dict_pkg_NET = {'清华': R'pip3 install {pkg_name} -i https://pypi.tuna.tsinghua.edu.cn/simple ',                '阿里云': R'pip3 install {pkg_name} -i http://mirrors.aliyun.com/pypi/simple/',                '中国科技大学': R'pip3 install {pkg_name} -i https://pypi.mirrors.ustc.edu.cn/simple/',                '华中理工大学': R'pip3 install {pkg_name} -i http://pypi.hustunique.com/',                '山东理工大学': R'pip3 install {pkg_name} -i http://pypi.sdutlinux.org/',                '豆瓣': R'pip3 install {pkg_name} -i http://pypi.douban.com/simple',                '豆瓣2': R'pip install {pkg_name} -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com',                '官网2': R'pip3 install {pkg_name}',                '官网': R'pip install {pkg_name}'                }

3、模块引用异常处理

使用 try...except...方式,引用模块如果失败,则通过遍历模块字典、镜像源地址进行实现模块安装,同时标识已成功安装的模块,避免重复安装。具体脚本如下:

    try:        print('import库: 开始')        # import numpy2 as np #没有numy2?        from pyecharts.charts import Bar        from pyecharts.charts import Line        from pyecharts import options as opts        import matplotlib.pyplot as plt        print('import库: END')    except Exception as err:        print('引用模块错误: ' + str(err))        print('
')        # 遍历库名        for key_pkg_name in dict_pkg_name:            if dict_pkg_name[key_pkg_name] == '0':                # 遍历网址进行安装                for key_pkg_NET in dict_pkg_NET:                    try:                        pip_install = dict_pkg_NET[key_pkg_NET].format(pkg_name=key_pkg_name)                        print('开始安装: '+pip_install)                        os.system(pip_install)                        dict_pkg_name[key_pkg_name] = '1'                        print('
')                        break                    except Exception as err:                        print('安装失败: ' + str(err))                        # print('
')                        pass

4、循环安装模块

上述的第3步中,模块引用失败安装,有时可能网络延时等各种原因,运行一次未能完全安装成功。故需多次循环运行。有时有些模块安装成功,但引用时仍然失败,如果引用失败就进行安装循环,可能会进入死循环。

故为避免死循环,设置循环次数为3,运行3次后,不管最终引用成功或失败,都终止循环安装。具体脚本如下:

count = 3  # 设置循环运行3次while count:    try:        print('import库: 开始')        # import numpy2 as np #没有numy2?        from pyecharts.charts import Bar        from pyecharts.charts import Line        from pyecharts import options as opts        import matplotlib.pyplot as plt        print('import库: END')        break    except Exception as err:        print('引用模块错误: ' + str(err))        print('
')        # 遍历库名        for key_pkg_name in dict_pkg_name:            if dict_pkg_name[key_pkg_name] == '0':                # 遍历网址进行安装                for key_pkg_NET in dict_pkg_NET:                    try:                        pip_install = dict_pkg_NET[key_pkg_NET].format(pkg_name=key_pkg_name)                        print('开始安装: '+pip_install)                        os.system(pip_install)                        dict_pkg_name[key_pkg_name] = '1'                        print('
')                        break                    except Exception as err:                        print('安装失败: ' + str(err))                        # print('
')                        pass    finally:        count -= 1


综上,所有脚本如下:

import os# 引用python模块库'''字典={库名: 安装情况}0未安装,1已安装'''dict_pkg_name = {'pyecharts': '0',  # 可视化图表库                 'pandas': '0',     # 数据处理库                 'echarts-countries-pypkg': '0',          # 全球国家地图-地图包                 'echarts-cities-pypkg': '0',             # 全球城市地图-地图包                 'echarts-china-provinces-pypkg': '0',    # 中国省级地图-地图包                 'echarts-china-cities-pypkg': '0',       # 中国市级地图-地图包                 'echarts-china-counties-pypkg': '0',     # 城市地图-地图包                 'echarts-china-misc-pypkg': '0',         # 未知地图-地图包                 'echarts-united-kingdom-pypkg': '0',     # 未知地图-地图包                 'output_file': '0',  # 图表输出                 '--upgrade pip': '0'  # 更新包 # pip install --upgrade package_name                 }# 国内镜像源dict_pkg_NET = {'清华': R'pip3 install {pkg_name} -i https://pypi.tuna.tsinghua.edu.cn/simple ',                '阿里云': R'pip3 install {pkg_name} -i http://mirrors.aliyun.com/pypi/simple/',                '中国科技大学': R'pip3 install {pkg_name} -i https://pypi.mirrors.ustc.edu.cn/simple/',                '华中理工大学': R'pip3 install {pkg_name} -i http://pypi.hustunique.com/',                '山东理工大学': R'pip3 install {pkg_name} -i http://pypi.sdutlinux.org/',                '豆瓣': R'pip3 install {pkg_name} -i http://pypi.douban.com/simple',                '豆瓣2': R'pip install {pkg_name} -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com',                '官网2': R'pip3 install {pkg_name}',                '官网': R'pip install {pkg_name}'                }count = 3  # 设置循环运行3次while count:    try:        print('import库: 开始')        # import numpy2 as np #没有numy2?        from pyecharts.charts import Bar        from pyecharts.charts import Line        from pyecharts import options as opts        import matplotlib.pyplot as plt        print('import库: END')        break    except Exception as err:        print('引用模块错误: ' + str(err))        print('
')        # 遍历库名        for key_pkg_name in dict_pkg_name:            if dict_pkg_name[key_pkg_name] == '0':                # 遍历网址进行安装                for key_pkg_NET in dict_pkg_NET:                    try:                        pip_install = dict_pkg_NET[key_pkg_NET].format(pkg_name=key_pkg_name)                        print('开始安装: '+pip_install)                        os.system(pip_install)                        dict_pkg_name[key_pkg_name] = '1'                        print('
')                        break                    except Exception as err:                        print('安装失败: ' + str(err))                        # print('
')                        pass    finally:        count -= 1# 主程序:if __name__ == '__main__':    print('主程序: ')
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章