在pipenv 处理依赖包。老是安装失败,有的依赖的版本不一样,那就不好整了。我的目的 我A项目的requirements.txt文件的依赖,能通过pip install -r requirements.txt
安装在我本地,因为我本地有的库没装,想偷懒不要一个个去敲。发现还真不行,自己可以去试哈。那我使用pipenv install -r requirements.txt 去给其他项目装,我擦发现也有大坑等着我去跳。所以我写了如下脚本。思想就是提取requirements.txt的key,去和本地pip3 list
去匹配。有相同的就不安装了。没相同的我就代码去安装,安装成功的包,用一个txt文本记录下来。那我先在本地执行pip3 install -r requirements.txt
会得到一个依赖环境。mkvirtualenv adeng
创建一个虚拟环境,这时候的虚拟环境是一个包都没装的,还是个处。然后用代码去一个个安装requirements.txt的包。这次是新的虚拟环境,所以我拿到的包是本地所有的包。这里我取名叫完美包。拿到完美包之后,循环读取完美包,读一行我执行pipenv install 包名
这样我所有的依赖就通过pipenv搞定了。
# !/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
===========================
@Time : 2021/11/12 22:08
@Author : 阿登
@Site : adeng
@File : pip_setup.py
@Software: PyCharm
============================
"""
import os
import sys
import time
def pip_install(filename,cmd):
"""
:param filename: requirements.txt 文件
:param cmd: workon 虚拟环境
:return:
"""
with open(filename, mode="r", encoding="utf-8") as f:
f1 = os.popen(f"{cmd} && pip3 list")
f1.readline()
f1.readline()
res = []
for line in f1:
line = line.strip().split()[0]
res.append(line)
while True:
readline = f.readline()
if not len(readline):
break
pack = readline.strip().split("=", 1)[0]
print(f"pack: {pack}")
if pack in res:
print(f"{pack}----已经安装过了,不用安装\n")
continue
time.sleep(0.2)
f2 = os.popen(f"{cmd} && pip3 install {pack}")
time.sleep(2)
data = f2.read()
print(data)
if "Successfully" in data:
print(f"{pack} 安装成功\n")
time.sleep(0.3)
with open(r"result_req.txt", mode="a+", encoding="utf-8")as f3:
f3.write(f"{pack}\n")
print(f"将{pack}写入文件\n")
time.sleep(1)
elif "Requirement" in data:
print(f"{pack}--- 已经安装过了\n")
elif "ERROR:" in data:
with open(r"result_error.txt", mode="a+", encoding="utf-8")as f3:
f3.write(f"{pack}\n")
print(f"将{pack}写入文件\n")
time.sleep(1)
else:
print(f"{pack}-----安装失败\n")
with open(r"res_req.txt", mode="a+", encoding="utf-8")as f3:
f3.write(f"{pack}\n")
print(f"将{pack}写入文件\n")
time.sleep(1)
def pip_uninstall(cmd):
"""
:param cmd: workon 虚拟环境名
:return:
"""
s = f"{cmd} && pip3 list"
print(s)
f1 = os.popen(s)
f1.readline()
f1.readline()
for line in f1:
line = line.strip().split()[0]
print(line)
print(f"pack:{line}")
if line in ["pip", "setuptools","wheel","Brotli"]:
continue
f2 = os.popen(f"{cmd} && pip3 uninstall {line} -y")
time.sleep(2)
res = f2.read()
if "Successfully" in res:
print(f"{line} 卸载成功")
print(res)
time.sleep(0.5)
# pip_uninstall("workon adeng")
# pip_install(r"req1.txt","workon adeng")
def pip_win_install(filename):
with open(filename, mode="r", encoding="utf-8") as f:
import subprocess
if subprocess.call("python3 -m pip install --upgrade pip"):
print("pip更新失败")
f1 = os.popen("pip3 list")
f1.readline()
f1.readline()
res = []
for line in f1:
line = line.strip().split()[0]
res.append(line)
while True:
readline = f.readline()
if not len(readline):
break
pack = readline.strip().split("=", 1)[0]
print(f"pack: {pack}")
if pack in res:
print(f"{pack}----已经安装过了,不用安装\n")
continue
time.sleep(0.2)
f2 = os.popen("pip3 install {pack}")
time.sleep(2)
data = f2.read()
print(data)
if "Successfully" in data:
print(f"{pack} 安装成功\n")
time.sleep(0.3)
with open(r"result_req1.txt", mode="a+", encoding="utf-8")as f3:
f3.write(f"{pack}\n")
print(f"将{pack}写入文件\n")
time.sleep(1)
elif "Requirement" in data:
print(f"{pack}--- 已经安装过了\n")
elif "ERROR:" in data:
with open(r"result_error1.txt", mode="a+", encoding="utf-8")as f3:
f3.write(f"{pack}\n")
print(f"将{pack}写入文件\n")
time.sleep(1)
else:
print(f"{pack}-----安装失败\n")
with open(r"res_req1.txt", mode="a+", encoding="utf-8")as f3:
f3.write(f"{pack}\n")
print(f"将{pack}写入文件\n")
time.sleep(1)
# pip_win_install(r"result_req.txt")
def pipenv__install(filename):
with open(filename, mode="r", encoding="utf-8") as f:
"""
这个函数,主要是给虚拟环境安装req*.txt文件所有包,
因为有时候req*.txt包里面的依赖会冲突,所以就如下处理
"""
import subprocess
if subprocess.call("python -m pip install --upgrade pip"):
print("pip更新失败")
# 前置条件
# 1.现在项目根目录执行命令 pipenv --three
# 2. 修改popfile 清华源为 https://pypi.tuna.tsinghua.edu.cn/simple
# 3.执行 pipenv install
pipenv = os.path.split(os.popen("pipenv --venv").read().strip())[1].strip()
# 得到的字符串有乱码 需要处理一下,后面多了6个字符,这里不要
pipenv = pipenv[:-6] #pipenv ="interfaceV3-ayB75vUS"
f1 = os.popen(f"workon {pipenv} && pip3 list")
time.sleep(1)
# print(f1.read())
print(f1.readline())
print(f1.readline())
res = []
for line in f1:
line = line.strip().split()[0]
res.append(line)
while True:
readline = f.readline()
if not len(readline):
break
pack = readline.strip().split("=", 1)[0]
print(f"pack: {pack}")
if pack in res:
print(f"{pack}----已经安装过了,不用安装\n")
continue
time.sleep(0.2)
f2 = os.popen(f"workon {pipenv} && pipenv install {pack}")
time.sleep(20)
data = f2.read()
print(data)
if f"Installing {pack}..." in data or "Installing dependencies from Pipfile.lock" in data:
print(f"{pack} 安装成功\n")
time.sleep(0.3)
with open(r"result_pipenv_req.txt", mode="a+", encoding="utf-8")as f3:
f3.write(f"{pack}\n")
print(f"将{pack}写入文件\n")
time.sleep(1)
elif "Requirement" in data:
print(f"{pack}--- 已经安装过了\n")
elif "ERROR:" in data:
with open(r"result_pipenv_error_req.txt", mode="a+", encoding="utf-8")as f3:
f3.write(f"{pack}\n")
print(f"将{pack}写入文件\n")
time.sleep(1)
else:
print(f"{pack}-----安装失败\n")
with open(r"res_pipenv_miss_req.txt", mode="a+", encoding="utf-8")as f3:
f3.write(f"{pack}\n")
print(f"将{pack}写入文件\n")
time.sleep(1)
pipenv__install(r"./result_req.txt")