pip虚拟环境冲突,解决

在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")

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容