目录

[TOC]


方法一

第一种方法使用了 Python 的内置函数 __import__ 来尝试导入所需的库。该方法简单易懂,但需要注意以下几点:

  • 使用 __import__ 并不总是很方便,特别是在需要加载动态模块或从不同位置加载模块时。
  • 如果要使用这个方法,需要小心包名,因为字符串中的任何错误都会导致导入失败。
def check_and_install_libraries(packages):
    """
    检查需要的库是否已经安装,并自动安装未安装的库
    :param packages: 需要检查和安装的库列表
    :return: True表示所有库都已成功安装,False表示至少有一个库未能成功安装
    """

    # 遍历库列表中的每个库
    for package in packages:

        # 尝试导入该库
        try:
            __import__(package)

        # 如果导入失败,则执行以下操作
        except ImportError:

            # 使用subprocess调用pip工具安装该库
            subprocess.check_call(["pip", "install", package])

    # 再次遍历库列表中的每个库
    for package in packages:

        # 尝试导入该库
        try:
            __import__(package)

        # 如果导入失败,则输出相应提示信息到控制台
        except ImportError:
            print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3] + f" 未能成功安装 {package}")

            # 返回False表示至少有一个库未能成功安装
            return False

    # 如果所有库都被成功安装,则返回True
    return True

# 运行库检测
packages = ["requests", "concurrent.futures"] #packages中的内容可以自己修改
# 调用check_and_install_libraries函数,传入需要检查和安装的库列表
success = check_and_install_libraries(packages)

方法二

第二种方法使用了较新的 importlib.util.find_spec 函数来检查模块是否存在并加载模块。标准库模块 importlib 提供了许多用于导入模块的函数,其中 importlib.util模块提供了几个工具函数,以支持更高级的导入场景。与第一种方法相比,第二种方法更加优雅且强大,并且具有以下优势:

  • 该方法可以应对各种复杂的导入场景,包括包含子模块的包、动态加载模块等。
  • 使用 importlib.util.find_spec 可以避免直接解析字符串,并且避免了可能出现的安全问题。
  • find_spec 还支持其他一些有用的参数,例如用于搜索路径的 path 参数。
def check_and_install_libraries(packages):
    """
    检查需要的库是否已经安装,并自动安装未安装的库
    :param packages: 需要检查和安装的库列表
    :return: True表示所有库都已成功安装,False表示至少有一个库未能成功安装
    """

    try:
        import importlib.util
    except ImportError:
        subprocess.check_call([sys.executable, "-m", "pip", "install", "importlib"])

    # 遍历库列表中的每个库
    for package in packages:

        # 尝试导入该库
        spec = importlib.util.find_spec(package)
        if spec is not None:
            continue

        # 使用subprocess调用pip工具安装该库
        subprocess.check_call([sys.executable, "-m", "pip", "install", package])

    # 再次遍历库列表中的每个库
    for package in packages:

        # 尝试导入该库
        spec = importlib.util.find_spec(package)

        # 如果导入失败,则输出相应提示信息到控制台
        if spec is None:
            print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3] + f" 未能成功安装 {package}")

            # 返回False表示至少有一个库未能成功安装
            return False

    # 如果所有库都被成功安装,则返回True
    return True

# 运行库检测
packages = ["requests", "concurrent.futures"] #packages中的内容可以自己修改
# 调用check_and_install_libraries函数,传入需要检查和安装的库列表
success = check_and_install_libraries(packages)

综上所述,第二种方法更好一些,因为它比较新、更强大、更安全,并且可以处理更多复杂的导入场景。

Last modification:March 28, 2023
V50%看看实力