一行代码实现Python动态加载依赖
作者:louisyoungx 时间:2021-11-22 19:10:39
目录
快速开始
通过 pip 安装运行
注入代码运行
前几天在一个开源项目里遇到好多用户反馈,不会安装依赖,或者执行 pip install -r requirements.txt
没有反应。
可能造成的原因有很多种,一一排查起来也很麻烦。
想一劳永逸解决这个问题,一般大家都是到 site-packages
里面把所需要的包导出来,放到项目根目录。
但这样终究太过粗糙,不符合Python优雅的个性。
所以我就想,能不能动态引入包,如果没有的话,再调用 pip 下载。最后也差不多实现了我的设想。
我大概查了一下,现在好像没有人用过这个方案,我自己使用感觉还是很方便的,分享给大家。
虽然想打成library给大家下载的,后来想到这又要依赖pip,违背了做动态依赖的本意
所以我推荐是使用 快速开始 - 注入代码运行 中的方式
快速开始
跪求star GitHub - louisyoungx/dypend
通过 pip 安装运行
在 PyPI 下载 dypend依赖包
pip install dypend
在本地生成 requirements.txt 依赖文件
pip freeze > requirements.txt
在项目的入口文件的最上层引入 dypend ,不用更改任何其他代码
import dypend
这时 dypend会检查你的Python环境中是否都有 requirements.txt 中的包,如果没有, dypend会调用 pip下载。
注入代码运行
在本地生成 requirements.txt 依赖文件
pip freeze > requirements.txt
在项目的入口文件的最上层添加如下代码,不用更改任何其他代码
import os
import re
REQUIREMENTS = os.getcwd() + '/requirements.txt'
def getDepends():
requirements = open(REQUIREMENTS, 'r')
libs = requirements.readlines()
libList = []
for lib in libs:
try:
name = re.search("^.+(?===)", lib).group(0)
version = re.search("(?<===).+$", lib).group(0)
libDict = {
"name": name,
"version": version
}
libList.append(libDict)
except:
continue
return libList
def importLib():
"""Load python dependent libraries dynamically"""
libList = getDepends()
from pip._internal import main as pip_main
import importlib
def install(package):
pip_main(['install', package])
createVar = locals()
for lib in libList:
print(lib)
try:
createVar[lib["name"]] = importlib.import_module(lib["name"])
except Exception as e:
try:
install(f'{lib["name"]}=={lib["version"]}')
createVar[lib["name"]] = importlib.import_module(lib["name"])
except Exception as e:
print(e)
importLib()
这时dypend会检查你的Python环境中是否都有 requirements.txt 中的包,如果没有,dypend会自动下载。
来源:https://juejin.cn/post/7039563208171978788
标签:Python,动态加载依赖
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
网页效果图设计之色彩索引
2008-03-23 13:53:00
![](https://img.aspxhome.com/file/UploadPic/up/2008032314313926.gif)
Go语言使用Gob传输数据
2023-08-06 05:12:28
Python中logging日志的四个等级和使用
2023-05-10 14:57:41
![](https://img.aspxhome.com/file/2023/8/76688_0s.png)
citespace数据处理:用python对Ref文档进行去重方式
2022-07-06 06:01:13
![](https://img.aspxhome.com/file/2023/4/75954_0s.jpg)
在Pycharm中修改文件默认打开方式的方法
2023-03-12 06:34:23
![](https://img.aspxhome.com/file/2023/0/72130_0s.jpg)
Pytorch学习笔记DCGAN极简入门教程
2022-05-28 17:29:02
python读写配置文件操作示例
2021-12-12 03:51:29
利用Python pyecharts绘制饼图
2023-06-13 08:56:21
![](https://img.aspxhome.com/file/2023/1/68431_0s.png)
4行Python代码生成图像验证码(2种)
2021-02-08 06:08:03
![](https://img.aspxhome.com/file/2023/9/76909_0s.png)
通过js获取div的background-image属性
2023-08-23 06:07:23
正则的replace方法(产生的字符串副本)
2008-06-03 13:31:00
python 读写excel文件操作示例【附源码下载】
2023-02-20 09:26:31
Python实现好友全头像的拼接实例(推荐)
2021-08-21 17:29:35
![](https://img.aspxhome.com/file/2023/1/75911_0s.jpg)
jRaiser与jQuery的冲突问题
2010-07-27 12:36:00
ASP 多关键词查询实例代码
2011-04-11 11:14:00
asp dictionary对象的用法
2011-04-14 11:09:00
Python unittest单元测试框架及断言方法
2023-10-29 12:07:48
![](https://img.aspxhome.com/file/2023/5/79785_0s.png)
Pycharm 2020最新永久激活码(附最新激活码和插件)
2023-06-14 14:21:21
![](https://img.aspxhome.com/file/2023/2/59132_0s.jpg)
sqlserver 2000中创建用户的图文方法
2012-03-26 18:26:39
微软SQLServer密码管理的危险判断
2008-11-24 17:34:00