pipUtils Python脚本:自动安装所需的依赖包(pip install 包)

pipUtils

  Python脚本:自动安装所需的依赖包(pip install 包)

原理

  利用python扫描python文件中的包名,然后利用os.comand()执行pip安装命令。

说明

  文件说明: 目前有三个版本:

  (1)pipUtil1.0.py: 需要指定某个文件 和 导入包的语句所在的行,主要用于对于个别文件的操作,因为没有遍历整个文件,速度较快 但是配置的参数略多,详见pipUtil1.0.py文件内的使用说明。

#!usr/bin/env python
#-*- coding:utf-8 _*-
"""
@author:cuntou0906
@file: pipUtils1.0.py
@time: 2020/11/27
"""

#############################################################################
# 使用注意事项:

# 1、务必将所有导入语句连在一起写 包括 import ** as *** ,from *** import *** 两种语法
# 2、自定义的包不会导入哦 因为根本不可以pip安装
# 3、使用时 只需要指定 某个py文件名和 导入语句所在行数的范围   (73 -74行)
# 4、特别注意包名是否存在替换 -- 按85行模板直接添加即可
# 5. 把该文件放在工程的根目录


#改进:
#(1)该脚本仅仅是 pip 某个文件所需的包,而且需要指定 包名所在的行(import语句、from语句)
#      因为这样效率更高,特别是对于大文件的时候
# (2) 另一种方式:搜索整个工程的py文件,对于每个文件 依次2找到所需安装的包名 然后逐个安装
#      这种全自动的方式对于大文件 效率会慢些,查包名需要遍历所有py文件
#      某个文件查找包名的方法:==》
#       直接找某一行是否以import或者from开头 直接读取第二个字符串(注意要去掉.之后的,参考该脚本的方法)
#      (1)import ** as *** :找import的后面的(“ ”分割)
#      (2)from *** import ***
# (3) 还可以把存在的包排除掉,不pip,还可以确定安装的版本

#############################################################################

import os                                              # 执行pip指令

def getpackage(path,lines):
    # 以只读模式打开文件,如果打开失败有error输出
    index = 1
    PackageName = []
    try:
        f = open(path, 'r',encoding='UTF-8')
        while(1):
            if index>=lines[0]:
                if index<=lines[1]:
                    str = f.readline()
                    # print("当前第",index,"行:",str)
                    strsplit = str.split()    # 分割字符串
                    str2 = strsplit[1]
                    loc = str2.find(".")   # 找到 . 的位置
                    if loc==-1:
                        PackageName.append(str2)
                    else:
                        PackageName.append(str2[0:loc])
                    pass
                else:
                    break
            else:
                str = f.readline()
            pass
            index = index + 1
    # 要用finally来关闭文件!
    finally:
        if f:
            f.close()
            pass
        pass
    return PackageName

#############################################################################

# 这里需要改:
# 首先是文件名path: 安装path.py 文件里的 import的包
# 导入包语句所在path中的行数范围:lines,为一个列表
#  如果使用Pycharm 直接打开文件看左侧的行号,就可以得到最大值和最小值

#############################################################################
path = 'Pack.py'                                       # 路径名称
lines = [9,13]                                         # import语句所在的行

PackageName = getpackage(path,lines)
# print(PackageName)

#############################################################################
# 因为很多包的名字和 import时候不一致 所以 这里需要替换
# 例如opencv 在import时候是cv2  但是 在安装时候是 opencv-python
# 这里需要额外添加   目前仅发现这个包 不一致  如果还有 只需要添加到这里就可以啦
# 添加方式 直接仿照下面这一行的代码就可以

PackageName = ['opencv-python' if i =='cv2' else i for i in PackageName]

#############################################################################


PackageName = list(set(PackageName))   # 去除重复的包名
print("所需安装的包:" ,PackageName)
print("总共需要安装  " ,len(PackageName),"  个包")

#############################################################################
# 阿里云 http://mirrors.aliyun.com/pypi/simple/
# 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
# 豆瓣(douban) http://pypi.douban.com/simple/
# 清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
# 中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/

#############################################################################
jingxiangstr = "https://pypi.tuna.tsinghua.edu.cn/simple/"  # 镜像源
for index in range(len(PackageName)):
    # 这里就直接pip安装了 不管之前是否有装过
    # 还可以先获取所有已经安装的包名字 然后判断是否已经装过了
    # 如果已经装过包 那么去查找可能很慢 还不如 直接装

    comand = "pip install " + PackageName[index] +" -i "+jingxiangstr
    # 正在安装
    print("------------------正在安装" + str(PackageName[index]) + " ----------------------")
    print(comand + "\n")
    os.system(comand)

os.system("pip list")    # 显示所有的包

  (2)pipUtil1.1.py: 需要指定某个文件,主要用于对于个别文件的操作,因为需要遍历整个文件,只需要配置文件目录即可,详见pipUtil1.1.py文件内的使用说明。

#!usr/bin/env python
#-*- coding:utf-8 _*-
"""
@author:cuntou0906
@file: pipUtils1.1.py
@time: 2020/11/27
"""

#############################################################################
# 使用注意事项:

# 1、务必将所有导入语句连在一起写 包括 import ** as *** ,from *** import *** 两种语法
# 2、自定义的包不会导入哦 因为根本不可以pip安装
# 3、 使用时 只需要指定 某个py文件的目录即可                        (68行)
# 4、特别注意包名是否存在替换 -- 按76行模板直接添加即可              (78行)
# 5. 把该文件放在工程的根目录


#改进:
#(1)该脚本仅仅是 pip 某个文件所需的包
# (2) 另一种方式:搜索整个工程的py文件,对于每个文件 依次2找到所需安装的包名 然后逐个安装
#      这种全自动的方式对于大文件 效率会慢些,查包名需要遍历所有py文件
#      某个文件查找包名的方法:==》
#       直接找某一行是否以import或者from开头 直接读取第二个字符串(注意要去掉.之后的,参考该脚本的方法)
#      (1)import ** as *** :找import的后面的(“ ”分割)
#      (2)from *** import ***
# (3) 还可以把存在的包排除掉,不pip,还可以确定安装的版本
#############################################################################

import os                                              # 执行pip指令

def getpackage(path):
    # 以只读模式打开文件,如果打开失败有error输出
    PackageName = []
    try:
        f = open(path, 'r',encoding='UTF-8')
        str = f.readline()
        while(str):
           # print("当前第",index,"行:",str)
           strsplit = str.split()    # 分割字符串
           # print(strsplit)
           if len(strsplit) >=2:
               if (strsplit[0] == "import") or (strsplit[0] == "from"):
                   str2 = strsplit[1]
                   loc = str2.find(".")  # 找到 . 的位置
                   if loc == -1:
                       PackageName.append(str2)
                   else:
                       PackageName.append(str2[0:loc])
                       pass
               else:
                   pass
           str = f.readline()

    # 要用finally来关闭文件!
    finally:
        if f:
            f.close()
            pass
        pass
    return PackageName

#############################################################################

# 这里需要改:
# 首先是文件名path: 安装path.py 文件里的 import的包

#############################################################################
path = './hahah/1.py'                      # 路径名称

# path = './tth/sdhfld/sdfdsjf/33.py'                      # 路径名称
# path = 'Pagelist.py'                                       # 路径名称

PackageName = getpackage(path)
# print(PackageName)

#############################################################################
# 因为很多包的名字和 import时候不一致 所以 这里需要替换
# 例如opencv 在import时候是cv2  但是 在安装时候是 opencv-python
# 这里需要额外添加   目前仅发现这个包 不一致  如果还有 只需要添加到这里就可以啦
# 添加方式 直接仿照下面这一行的代码就可以   !!!欢迎补充

PackageName = ['opencv-python' if i =='cv2' else i for i in PackageName]

#############################################################################


PackageName = list(set(PackageName))   # 去除重复的包名
print("所需安装的包:" ,PackageName)
print("总共需要安装  " ,len(PackageName),"  个包")

#############################################################################
# 阿里云 http://mirrors.aliyun.com/pypi/simple/
# 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
# 豆瓣(douban) http://pypi.douban.com/simple/
# 清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
# 中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/

#############################################################################
jingxiangstr = "https://pypi.tuna.tsinghua.edu.cn/simple/"  # 镜像源
for index in range(len(PackageName)):
    # 这里就直接pip安装了 不管之前是否有装过
    # 还可以先获取所有已经安装的包名字 然后判断是否已经装过了
    # 如果已经装过包 那么去查找可能很慢 还不如 直接装

    comand = "pip install " + PackageName[index] +" -i "+jingxiangstr
    # 正在安装
    print("------------------正在安装" + str(PackageName[index]) + " ----------------------")
    print(comand + "\n")
    os.system(comand)

os.system("pip list")    # 显示所有的包

  (3)pipUtil2.0.py: 用于pip安装工程所需的依赖包,可以排除根目录下的某些目录(主要是环境目录),主要用于对于整个工程的操作,遍历整个工程的文件(除去略去的目录) 详见pipUtil2.0.py文件内的使用说明。

#!usr/bin/env python
#-*- coding:utf-8 _*-
"""
@author:cuntou0906
@file: pipUtils2.0.py
@time: 2020/11/27
"""

#############################################################################
# 使用注意事项:

# 1、注意  要忽略的当前文件夹!!!!一般都是环境配置的目录 不需要pip  仿造69-70行代码
# 2、自定义的包不会导入哦 因为根本不可以pip安装
# 3、特别注意包名是否存在替换 -- 按76行模板直接添加即可  (105行)
# 4. 把该文件放在工程的根目录

# 改进:
# (1) 还可以把存在的包排除掉,不pip,还可以确定安装的版本

#############################################################################

import os

def getpackage(path):
    # 以只读模式打开文件,如果打开失败有error输出
    # PackageName = []
    try:
        f = open(path,mode= 'r',encoding='UTF-8')
        str = f.readline()
        while(str):
           # print("当前第 行:",str)
           strsplit = str.split()    # 分割字符串
           # print(strsplit)
           if len(strsplit) >=2:
               if (strsplit[0] == "import") or (strsplit[0] == "from"):
                   str2 = strsplit[1]
                   loc = str2.find(".")  # 找到 . 的位置
                   if loc == -1:
                       PackageName.append(str2)
                   else:
                       PackageName.append(str2[0:loc])
                       pass
               else:
                   pass
           str = f.readline()

    # 要用finally来关闭文件!
    finally:
        if f:
            f.close()
            pass
        pass
    # return PackageName


CurAllDir = [dir for dir in os.listdir("./")]
CurDir = []
CurFil = []
for index in CurAllDir:
    if os.path.isdir('.\\'+index):
        CurDir.append(".\\"+index)
        pass
    else:
        CurFil.append("./"+index)
    pass



#############################################################################
# 注意要忽略的文件夹!!! 只支持当前文件夹!!! 要忽略的直接这里按摩板添加就可以啦

CurDir.remove(".\\venv")     # 去除部分目录  主要是venv环境目录
CurDir.remove(".\\.idea")     # 去除部分目录  主要是venv环境目录

#############################################################################

# print(CurDir)  # 当前需要pip 的目录
# print(CurFil)  # 当前需要pip 的文件


PackageName = []   # 保存所有包名

for dir in CurDir:  # 对每个文件夹处理
    for root, dirs, files in os.walk(dir):
        for file in files:
            if file.endswith(".py"):
                # print(os.path.join(root, file))
                filename = str(os.path.join(root, file)).replace("\\","/")
                # print(filename)
                getpackage(str(os.path.join(root, file)))
                pass
            pass
        pass
    pass
# print(PackageName)

for dir in CurFil:   # 对当前目录下文件处理
    getpackage(dir)
    pass
# print(PackageName)

#############################################################################
# 因为很多包的名字和 import时候不一致 所以 这里需要替换
# 例如opencv 在import时候是cv2  但是 在安装时候是 opencv-python
# 这里需要额外添加   目前仅发现这个包 不一致  如果还有 只需要添加到这里就可以啦
# 添加方式 直接仿照下面这一行的代码就可以   !!!欢迎补充

PackageName = ['opencv-python' if i =='cv2' else i for i in PackageName]

#############################################################################


PackageName = list(set(PackageName))   # 去除重复的包名
print("所需安装的包:" ,PackageName)
print("总共需要安装  " ,len(PackageName),"  个包")

#############################################################################
# 阿里云 http://mirrors.aliyun.com/pypi/simple/
# 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
# 豆瓣(douban) http://pypi.douban.com/simple/
# 清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
# 中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/

#############################################################################
jingxiangstr = "https://pypi.tuna.tsinghua.edu.cn/simple/"  # 镜像源
for index in range(len(PackageName)):
    # 这里就直接pip安装了 不管之前是否有装过
    # 还可以先获取所有已经安装的包名字 然后判断是否已经装过了
    # 如果已经装过包 那么去查找可能很慢 还不如 直接装

    comand = "pip install " + PackageName[index] +" -i "+jingxiangstr
    # 正在安装
    print("------------------正在安装"+str(PackageName[index])+" ----------------------")
    print(comand+"\n")
    os.system(comand)

os.system("pip list")    # 显示所有的包

  其余文件都是为了做测试的,可忽略!!!

源码获取

点这里!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cuntou0906

玛莎拉蒂是我的目标!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值