自动安装需要的模块包(自动安装需要的模块包括什么)

小编:迷魂冰 更新时间:2022-08-31

在部署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('\n') # 遍历库名 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('\n') break except Exception as err: print('安装失败: ' + str(err)) # print('\n') 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('\n') # 遍历库名 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('\n') break except Exception as err: print('安装失败: ' + str(err)) # print('\n') 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('\n') # 遍历库名 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('\n') break except Exception as err: print('安装失败: ' + str(err)) # print('\n') pass finally: count -= 1 # 主程序: if __name__ == '__main__': print('主程序: ')