一行代码实现Python动态加载依赖
作者:louisyoungx 发布时间:2021-11-22 19:10:39
标签:Python,动态加载依赖
目录
快速开始
通过 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


猜你喜欢
- 硬件平台:SUN Ultra Enterprise 3000 操作系统:Solaris 2.5(中文简体) 磁盘:4.2GB 内存:256M
- 武器档案名称:firebug最新版本:1.7用途:前端调试器必备指数:使用难度:firebug是前端最具盛名的调试器,功能非常强悍。fire
- 初学python,写一个小程序练习一下。主要功能就是增删改查的一些功能。主要用到的技术:字典的使用,pickle的使用,io文件操作。代码如
- 连接MySQL时出现1449与1045异常解决办法mysql 1449 : The user specified as a definer
- 1-错误详情cmd下运行net start mysql启动MySQL服务:提示发生系统错误5。拒绝访问。cmd管理员模式运行可以启动MySQ
- 本文实例为大家分享了原生js实现波浪导航效果的具体代码,供大家参考,具体内容如下展示效果:源码展示:<!doctype html>
- 今天调试某页面样式,发现chrome下出现问题,但是同样基于webkit引擎的safari没有问题,很是郁闷。于是寻找针对google ch
- 网上关于各种降维算法的资料参差不齐,同时大部分不提供源代码。这里有个 GitHub 项目整理了使用 Python 实现了 11 种经典的数据
- 1. 使用到的库① wxpy:初始化微信机器人② openpyxl:保存微信好友数据为Excel表格③ pyecharts:生成可视化的地图
- 配置环境: 1、数 据 库:Oracle 8i R2 (8.1.7) for NT 企业版 2、安装路径:C:ORACLE 实现方法: 1.
- SQL Server 2005数据库中增加了XML类型,在创建表的时候可以指定某一列为XML类型,示例如下:CREATE TABL
- 用Python生成一个简单的密码本,一般是有数字、字母和符号组成,这里用到的思路主要是穷举法。通过使用pywifi 模块,根据密码本暴力破解
- 一、re是什么?正则表达式是一个特殊的字符序列,能方便的检查一个字符串是否与某种模式匹配。re模块使得python拥有全部的正则表达式功能。
- 本文实例讲述了python使用BeautifulSoup分析网页信息的方法。分享给大家供大家参考。具体如下:这段python代码查找网页上的
- 与前面一样我们会用fso来对文件或文件夹进行创建与删除操作了,其实fso有强大的功能但非常危险的哦,下面我们不来看看删除实例吧,在这些例子,
- 效果图动画代码这里 只提供图中购物车动画代码,不提供以上点餐界面(需要点餐界面 点击这里:Gitee仓库)。在触发代码中使用 this.ca
- 前言: 本篇文章主要介绍MySQL长事务相关内容,比如说我们开启的一个事务,一直没提交或回滚会怎样呢,出现事务等待情况应该如何处理,本篇文章
- SCRIPT 标记 用于包含JavaScript代码. 属性 LANGUAGE&nbs
- 我已安装了WINDOWS NT OPTON PACK 中的SMTP Service,请问如何使用它的发送邮件功能?在安装了SMTP Serv
- 当然有其它工具可以做这件事,但如果客户不允许你在服务器乱装东西时这个脚本就会有用了。 代码如下:DECLARE @tbImportTable