[Python3学习]如何用pip删除python模块所有的依赖子模块?

声明:本文首发于本人知乎文章,转载请按照规范声明文章来源,谢谢!

目录

  • 方法一
  • 方法二

当你用pip install xxx完成了xxx模块安装后,你会发现会自动帮你安装xxx依赖的模块,最后会显示如下的内容:

(以下操作均以pipenv模块为例)
pip install pipenv的结果截图
pip果然很Nice!一下就帮咱们安装了所有的模块,不用一个个去手动去pip install了!

你如果有一天想删除pipenv了,可以用pip uninstall -y pipenv来删除pipenv,也是很简单的。

pip uninstall -y pipenv

但是,“皇上,你还记得大明湖畔的夏雨荷吗”?
[Python3学习]如何用pip删除python模块所有的依赖子模块?_第1张图片
啊不,你是否还会记得之前在安装pipenv的时候,pip已经帮你安装了pipenv所依赖的全家桶?

所以,此时,你是否需要删除pipenv的依赖包呢?

如果需要删除,那么,不好意思,pip没有帮你提供删除依赖包的指令。我想了下,这个其实也是为了方便你下次再安装pipenv的时候不用下载依赖包。

如果你一定要删除,有两种方法:

方法一

pip show pipenv

此时会显示出pipenv的安装信息,如下图所示:
[Python3学习]如何用pip删除python模块所有的依赖子模块?_第2张图片
看到倒数第2行的Requires了吧,那些就是pipenv的依赖包。

你可以手动用pip uninstall -y xxx依次删除了!

注意:不要把pip和setuptools给删了,这2个是pip安装xxx模块需要用的!
注意:不要把pip和setuptools给删了,这2个是pip安装xxx模块需要用的!
注意:不要把pip和setuptools给删了,这2个是pip安装xxx模块需要用的!

方法二

自己写一个脚本来批量删除依赖包!

这个才是我今天这篇文章的重点。
这个才是我今天这篇文章的重点。
这个才是我今天这篇文章的重点。

所以,Come’on,every buddies!下面的内容才是本文的重点,大家都看仔细了哈~

import os


# 白名单,避免被误删
WHITELIST = ['pip', 'setuptools']
# 需要删除的模块列表
REMOVELIST = []


def get_requires(module_name):
    """
    查看一个模块的依赖
    :param module_name: 模块名
    :return: module_name 所依赖的模块的列表
    """
    with os.popen('pip show %s' % module_name) as p:
        requires = p.readlines()
        if not len(requires):
            return []

        reqs = ''
        for line in requires:
            if not line.startswith('Requires:'):
                continue
            reqs = line.strip()
        
        requires = reqs.split(':')[-1].replace(' ', '').strip()
        if requires:
            requires = requires.split(',')
        else:
            requires = []
        return requires


def get_required_bys(module_name):
    """
    查看一个模块被哪些模块依赖
    :param module_name: 模块名
    :return: module_name 被依赖的模块的列表
    """
    with os.popen('pip show %s' % module_name) as p:
        req_by = p.readlines()
        if not len(req_by):
            return []

        required = ''
        for line in req_by:
            if not line.startswith('Required-by:'):
                continue
            required = line.strip()
        
        req_by = required.split(':')[-1].replace(' ', '').strip()
        if req_by:
            req_by = req_by.split(',')
        else:
            req_by = []
        return req_by


def install(name):
    os.system(f'pip install {name}')


def get_all_requires(module_name):
    """
    递归地获取一个模块所有的依赖
    :param module_name: 模块名称
    :return: None
    """
    dependents = get_requires(module_name)
    for package in dependents:
        if package in WHITELIST:
            #print(f'[{package}] in white list')
            continue
        get_all_requires(package)
    REMOVELIST.append(module_name)


def remove(module_name):
    print('Scanning packages...')
    get_all_requires(module_name)
    s_packages =  ','.join(REMOVELIST)
    print(f'[INFO]Found packages: {s_packages}\n')

    for package in REMOVELIST:
        req_bys = get_required_bys(package)
        print('[INFO]removing:', package)
        #print(package, 'is required by:', req_bys)
        flag = True
        for req_by in req_bys:
            if req_by not in REMOVELIST:
                flag = False
                print(f'[NOTICE]As "{package}" is required by "{req_by}" which is not in {REMOVELIST}, skipped...\n')
                break
        if flag:
            print('\n')
            #os.system('pip uninstall -y %s' % package)


if __name__ == '__main__':
    pkg_name = input('请输入要卸载的第三方模块包: ')
    #install(pkg_name)
    remove(pkg_name)

接下来,就运行一下代码试试吧!

没有删除成功?

哦哦,记得把 #os.system(‘pip uninstall -y %s’ % package) 这句前面的 # 去掉就可以了!

最后,如果脚本运行成功了记得关注我,然后收藏本文,再给我点个赞!千万不要打赏~
[Python3学习]如何用pip删除python模块所有的依赖子模块?_第3张图片

你可能感兴趣的:(Python相关,程序员,python,小技巧)