前几天在一个开源我的项目里遇到好多用户反馈,不会装置依赖,或者执行 pip install -r requirements.txt 没有反馈。

可能造成的起因有很多种,一一排查起来也很麻烦。

想一劳永逸解决这个问题,个别大家都是到 site-packages 外面把所须要的包导出来,放到我的项目根目录。

但这样究竟太过毛糙,不合乎Python优雅的共性。

所以我就想,能不能动静引入包,如果没有的话,再调用 pip 下载。最初也差不多实现了我的构想。

我大略查了一下,当初如同没有人用过这个计划,我本人应用感觉还是很不便的,分享给大家。

尽管想打成library给大家下载的,起初想到这又要依赖pip,违反了做动静依赖的本意

所以我举荐是应用 疾速开始 - 注入代码运行 中的形式

疾速开始

通过 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 osimport reREQUIREMENTS = 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 libListdef 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会主动下载。

如果此篇文章对您有帮忙的话,麻烦点个赞再走喔~