虽然最好的复现方式是再新创建一个虚拟环境然后完全安装对应版本,但是当我要跑好几个类似的代码的时候,就不想每个都创建一个虚拟环境了,直接用原来的,然后添加一些包依赖。
所以我们就大概的步骤就是找到对应的包,检查是否安装过,如果没有则进行安装。
import yaml
with open("ControlNet/environment.yaml", "r") as stream:
data = yaml.safe_load(stream)
pip_dependencies = data["dependencies"][-1]["pip"] # 找到对应的pip依赖包
print(pip_dependencies)
def split_by_equal(s): # 为了与原始的环境兼容,去掉其固定的版本
return s.split('==')[0]
lst = [split_by_equal(x) for x in pip_dependencies]
import importlib # 使用这个库来动态导入
for pip_dependency in lst:
try:
my_module = importlib.import_module(pip_dependency) # 尝试直接import这个包
except ImportError: # 报错了就说明没有这个包
from pip._internal import main as pip
pip(['install', '--user', pip_dependency]) # 进行安装
my_module = importlib.import_module(pip_dependency) # 再次验证