在部署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('主程序: ')