如何检查模块是不是安装在 Python 中,如果没有,则将其安装在代码中?

Posted

技术标签:

【中文标题】如何检查模块是不是安装在 Python 中,如果没有,则将其安装在代码中?【英文标题】:How to check if a module is installed in Python and, if not, install it within the code?如何检查模块是否安装在 Python 中,如果没有,则将其安装在代码中? 【发布时间】:2017-10-27 21:12:33 【问题描述】:

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

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

install('mutagen')

install('gTTS')

from gtts import gTTS
from mutagen.mp3 import MP3

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

【问题讨论】:

你想要一个python脚本来运行执行安装检查和安装的命令吗?或者你可以在所有这些“计算机”上执行 shell 命令吗? 虽然从技术上讲,您可以从脚本中强制安装模块,但不要这样做,这是一种不好的做法,如果您这样做,人们将不可避免地讨厌您。相反,学习如何正确打包和分发您的 Python 应用程序:digitalocean.com/community/tutorials/… @zwer 是正确的。不要这样做。如果你的包有依赖,让pip处理。 可能重复:Check if Python Package is installed 【参考方案1】:

你可以使用简单的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

【讨论】:

【参考方案2】:

虽然@girrafish 的回答可能就足够了,但您也可以通过importlib 检查软件包安装情况:

import importlib

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

如果你想知道一个包是否被安装,你可以在你的终端中使用以下命令来检查它:

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”)。如果您没有任何输出,则表示该库未安装。

【讨论】:

请添加一些说明,而不仅仅是代码块 这完全不是答案,因为问题也是在询问如何安装,并从代码中完成所有这些...... "start with" 在技术上应该是 "contains" ... grep "\wquant" 或 grep "^quant" 会更准确。在 Windows 上,我还需要 grep -E 来扩展正则表达式。【参考方案5】:

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

    打开空闲 浏览到文件 > 打开模块 > 某些模块 IDLE 将显示模块或提示错误消息。

以上是用python 3.9.0测试的

【讨论】:

我认为这个问题意味着 Python 代码将在每台运行它的计算机上安装模块【参考方案6】:

编辑 - 2020/02/03

自从我发布这个答案以来,pip 模块已经更新了很多。我已经用正确的方法更新了 sn-p 以安装缺少的依赖项,即使用 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。

【讨论】:

这很好用,但是它给出了“要求已经满足”的输出,当你打开它时,在代码的开头添加了不必要的混乱。有没有办法让它不回应“已经满足的要求”? 请添加免责声明,只要有人在其代码中使用import pip 作为正确包装的解决方法,小猫就会死亡。 -_- @TheGirrafish 抱歉,我的意思是该列表由 pip 库中的“EggInfoDistribution”(以及 DistINfoDistribution)组成。例如,在我的情况下,列表中的第一项是“xmltodict 0.10.2”,但 "xmltodict 0.10.2" in pip.get_installed_distributions() 返回 False 而 "xmltodict 0.10.2" in str(pip.get_installed_distributions()) 返回 True @dcoles 感谢您提出这个问题,我已将代码 sn-p 更改为使用 subprocess 而不是 pip 另外,而不是使用而不是重定向sys.stdout,我建议只使用subprocess.check_call(args, stdout=subprocess.DEVNULL) 来忽略pip 的标准输出。【参考方案7】:

您可以使用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 是使用subprocess 执行它:

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

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:

你可以使用命令行:

python -m MyModule

它会说模块是否存在

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

pip freeze > requirements.txt

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

和:

pip install -r requirements.txt

加载它们

它会自动你的目的

玩得开心

【讨论】:

以上是关于如何检查模块是不是安装在 Python 中,如果没有,则将其安装在代码中?的主要内容,如果未能解决你的问题,请参考以下文章

如何编写一个函数来检查模块列表是不是存在,否则在 Python 中安装模块

如何检查 Lua 中是不是存在模块?

如何检查您是不是在 Jupyter 笔记本中

如何检查自己使用的pc机的telnet服务是不是启动?

检查是不是安装了 Python 包

如何检查 Python 包中的任何模块是不是从另一个包导入?