如何检查 Python 中是否安装了模块,如果没有,则在代码中安装它?

How to check if a module is installed in Python and, if not, install it within the code?

我想为我的代码安装模块 'mutagen' 和 'gTTS',但我想要它,这样它会在没有这些模块的每台计算机上安装它们,但是如果它们已经安装,它不会尝试安装它们。我目前有:

def install(package):
    pip.main(['install', package])

install('mutagen')

install('gTTS')

from gtts import gTTS
from mutagen.mp3 import MP3

但是,如果您已经有了这些模块,这只会在您打开程序时给程序的开头添加不必要的混乱。

您可以使用命令行:

python -m MyModule

它会说模块是否存在

否则,您可以简单地使用最佳实践:

pip freeze > requirements.txt

这会将您安装的模块 python 安装在一个文件中

和:

pip install -r requirements.txt

加载它们

它会自动满足你的目的

玩得开心

编辑 - 2020/02/03

自从我发布此答案以来,pip 模块已经更新了很多。我已经用安装缺失依赖项的正确方法更新了代码片段,即使用 subprocesspkg_resources,而不是 pip.

要隐藏输出,您可以将子进程输出重定向到 devnull:

import sys
import subprocess
import pkg_resources

required = {'mutagen', 'gTTS'}
installed = {pkg.key for pkg in pkg_resources.working_set}
missing = required - installed

if missing:
    python = sys.executable
    subprocess.check_call([python, '-m', 'pip', 'install', *missing], stdout=subprocess.DEVNULL)

就像@zwer 提到的那样,上面的方法有效,尽管它不被视为打包项目的正确方法。要更深入地了解这一点,请阅读页面 How to package a Python App

另一种解决方案是将您要导入的任何内容的导入语句放入 try/except 块中,因此如果它有效,它就会被安装,但如果无效,它会抛出异常,您可以 运行 安装它的命令。

如果您想知道某个软件包是否已安装,您可以在终端中使用以下命令进行检查:

pip list | grep <module_name_you_want_to_check>

这是如何工作的:

pip list

列出安装在 Python 中的所有模块。

竖线|通常被称为“管道”。它用于将一个命令通过管道传输到另一个命令。也就是说,它将第一个命令的输出定向到第二个命令的输入。

grep <module_name_you_want_to_check>

从列表中找到关键字。

示例:

pip list| grep quant

列出所有以“quant”开头的软件包(例如“quantstrats”)。如果你没有任何输出,这意味着库没有安装。

您可以使用 pkg_resources.get_distribution:

检查是否安装了软件包
import pkg_resources

for package in ['mutagen', 'gTTS']:
    try:
        dist = pkg_resources.get_distribution(package)
        print('{} ({}) is installed'.format(dist.key, dist.version))
    except pkg_resources.DistributionNotFound:
        print('{} is NOT installed'.format(package))

注意:您不应该直接导入 pip 模块作为 pip 命令的 it is an unsupported use-case

recommended way of using pip from your program is to execute it using subprocess:

subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'my_package'])

你可以使用简单的 try/except:

try:
    import mutagen
    print("module 'mutagen' is installed")
except ModuleNotFoundError:
    print("module 'mutagen' is not installed")
    # or
    install("mutagen") # the install function from the question

如果您想预览是否安装了特定的包(或某些包),也许您可​​以使用 python 中的空闲。 具体来说:

  1. 打开闲置
  2. 浏览到文件 > 打开模块 > 一些模块
  3. IDLE 将显示模块或提示错误消息。

以上是使用 python 3.9.0

测试的

你可以运行pip show package_name 或广阔的视野 use pip list Reference

尽管@girrafish 的回答可能就足够了,您也可以通过 importlib 检查软件包安装:

import importlib

packages = ['mutagen', 'gTTS']
[subprocess.check_call(['pip', 'install', pkg]) 
for pkg in packages if not importlib.util.find_spec(pkg)]