关于php:Python一行代码动态加载依赖

51次阅读

共计 1494 个字符,预计需要花费 4 分钟才能阅读完成。

前几天在一个开源我的项目里遇到好多用户反馈,不会装置依赖,或者执行 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 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 会主动下载。

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

正文完
 0