当前位置: 首页 > 后端技术 > PHP

一行Python代码动态加载依赖

时间:2023-03-30 05:02:57 PHP

前几天在一个开源项目中遇到很多用户反馈说不会安装依赖,或者执行pipinstall-rrequirements.txt没有反应。可能的原因有很多,要一一排查非常麻烦。为了一劳永逸地解决这个问题,大家通常会把需要的包从site-packages中导出,放到项目的根目录下。但是这样毕竟太粗糙了,不符合Python优雅的个性。于是就想,能不能动态导入包,不行就调用pip下载。最后,我的设想几乎实现了。大概查了一下,现在好像没有人用过这个方案。感觉自己用起来很方便,所以分享给大家。虽然想做成一个库供大家下载,但是又想到又依赖pip,违背了做动态依赖的初衷,所以推荐使用快速启动-注入代码运行,快速开始安装和运行在PyPI上通过pip下载dypend依赖包pipinstalldypend在本地生成requirements.txt依赖文件pipfreeze>requirements.txt在项目入口文件顶层importdypend其他代码不改importdypend处这次dypend会检查你的Python环境中是否有要求.txt中的包,如果没有,dypend会调用pip进行下载。注入的代码在本地运行生成requirements.txt依赖文件pipfreeze>requirements.txt在项目入口文件顶部添加如下代码,其他代码不变importosimportreREQUIREMENTS=os.getcwd()+'/requirements.txt'defgetDepends():requirements=open(REQUIREMENTS,'r')libs=requirements.readlines()libList=[]forlibinlibs:try:name=re.search("^.+(?===)",lib).group(0)version=re.search("(?<===).+$",lib).group(0)libDict={"name":name,"version":version}libList.append(libDict)除了:继续returnlibListdefimportLib():"""Loadpythondependentlibrariesdynamically"""libList=getDepends()frompip._internalimportmainaspip_mainimportimportlibdefinstall(package):pip_main(['install',package])createVar=locals()forlibinlibList:print(lib)try:createVar[lib["name"]]=importlib.import_module(lib["name"])除了异常为e:try:install(f'{lib["name"]}=={lib["version"]}')createVar[lib["name"]]=importlib.import_module(lib["name"])exceptExceptionase:print(e)importLib()这时候dypend会检查你的Python环境中requirements.txt中是否有packages,如果没有,dypend会自动下载如果本文对你有帮助,请点个赞就走~

猜你喜欢