吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1833|回复: 11
收起左侧

[Python 原创] 【重装救急】批量安装python源文件中import了的库

[复制链接]
wkdxz 发表于 2023-9-3 16:33
本帖最后由 wkdxz 于 2023-9-6 09:20 编辑

备份当前已安装的库,本来应该执行以下步骤,先运行pip freeze > requirements.txt
然后运行pip install -r requirements.txt



然而,我今天手欠将python3.8.5升级到3.10.4,发现原先的库好多都不兼容,用不了。之前的库也忘了备份到requirements.txt。
想换回原先的版本,安装时一直提示:0x80070001错误。于是我慌了,一堆脚本需要调用的,如果一下子都用不了,我的工作量估计要增加好几倍。
于是有了下面的代码:

功能:
  • 查找指定目录内已有的python源文件
  • 找出文件里import了哪些库
  • 然后使用代码判断这些库是否安装
  • 未安装就使用pip install安装库

虽然代码简单,但帮了我大忙,只花了10多分钟时间,我的python又满血复活了。

[Python] 纯文本查看 复制代码
import os
import ast
import subprocess


def dir_files(directory, extension):
    """遍历目录内指定后缀"""
    file_list = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            if file.endswith(extension):
                if "tempCodeRunnerFile" not in file:  # CodeRunner生成的临时文件忽略掉
                    file_list.append(os.path.join(root, file))
    return file_list


def py_file_list(python_file_folders):
    """查找指定目录内容的python文件"""
    pylist = []
    for directory_to_search in python_file_folders:
        for f in [".py", ".pyw"]:  # python文件后缀
            tmp_files = dir_files(directory_to_search, f)
            pylist += tmp_files
    return pylist


def parse_imports(filename):
    """解析python源文件import了哪些库"""
    with open(filename, "r", encoding="utf-8") as f:
        tree = ast.parse(f.read())
    imports = set()
    for node in ast.iter_child_nodes(tree):
        if isinstance(node, ast.Import):
            for alias in node.names:
                imports.add(alias.name.split(".")[0])
        elif isinstance(node, ast.ImportFrom):
            module_name = node.module.split(".")[0] if node.module else ""
            for alias in node.names:
                imports.add(module_name + "." + alias.name.split(".")[0])

    return list(imports)


def pip_install(libraries):
    """判断是否安装了库 没有就直接pip安装"""
    for library in libraries:
        library = library.split(".")[0]
        try:
            __import__(library)
            # print(library, "已安装")
        except ImportError:
            print(f"{library} 没有安装,正在使用pip安装...")
            subprocess.call(["pip", "install", library])
            # print("未安装:", library)


if __name__ == "__main__":
    py_folders = [r"E:\Backup\脚本", r"E:\管理系统", r"E:\桌面文件"]

    py_lists = py_file_list(py_folders)
    # print(py_lists)

    all_imports = []
    # 输出列表中的文件路径
    for py_file in py_lists:
        imports = parse_imports(py_file)

        # print(py_file, imports)

        all_imports += [library.split(".")[0] for library in imports]

    if imports:
        imports = set(all_imports)
        pip_install(imports)

免费评分

参与人数 7吾爱币 +13 热心值 +6 收起 理由
ase1993 + 1 + 1 用pip list获取模块和版本号列表出来重装更好
zjm2013 + 1 + 1 谢谢@Thanks!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
FDE9 + 1 用心讨论,共获提升!
wiltzy + 1 + 1 我很赞同!
CYZ000 + 1 + 1 热心回复!
SanKing + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

爱飞的猫 发表于 2023-9-3 17:33
如果代码重要,就应该提前记录到 requirements 里面

另外一般都会用 venv 在项目目录建立一个独立的 Python 环境,隔离 Python 依赖

免费评分

参与人数 1吾爱币 +2 热心值 +1 收起 理由
hrh123 + 2 + 1 我很赞同!

查看全部评分

吾乃齐天大圣 发表于 2023-9-3 17:59
ccber 发表于 2023-9-3 19:58
sai609 发表于 2023-9-3 20:36
一、安装andconda,内置多个第三方库
二、最新的版本,得卸载旧版,install安装最新的。。。。但是有时会新旧or与其他库共存而冲突
666888tzq 发表于 2023-9-3 21:08
我的Python自打安装了就没打开过几次。
头像被屏蔽
moruye 发表于 2023-9-3 23:26
提示: 作者被禁止或删除 内容自动屏蔽
lcg2014 发表于 2023-9-4 09:30
学习经验,保持进步
fatsheepfy58 发表于 2023-9-4 11:05
出现问题,解决问题,赞
三滑稽甲苯 发表于 2023-9-5 21:57
如果其中有的库只支持 Python 3.8.5,阁下又当如何应对
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 21:41

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表