首页 归档 关于 learn love 工具

python 自动安装依赖

为某些python脚本,没有requirements.txt,自动分析其依赖,进行自动安装. 下面介绍两种方法

pip工具

pigar仅打包当前目录下python文件的依赖。安装命令如下:

pip install pigar # 安装工具
pigar generate #生成requirements.txt

自定义脚本

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 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)
        except ImportError:
            print(f"{library} 没有安装,正在使用pip安装...")
            subprocess.call(["pip", "install", library])

if __name__ == "__main__":
    # 指定项目文件夹路径
    python_file_folders = [r"D:\\project\\"]

    # 查找项目中的Python文件
    python_files = []
    for folder in python_file_folders:
        python_files += dir_files(folder, ".py") + dir_files(folder, ".pyw")

    print("找到的Python文件:", python_files)

    # 解析Python文件中的依赖库
    all_imports = []
    for python_file in python_files:
        imports = parse_imports(python_file)
        all_imports += [library.split(".")[0] for library in imports]

    print("项目中使用的依赖库:", all_imports)

    # 自动安装依赖库
    if all_imports:
        imports = set(all_imports)
        pip_install(imports)

参考

  • https://visionguide.readthedocs.io/zh-cn/latest/python/tool/requirements/