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

Gam*_*r01 11 python module python-module python-3.x

我想为我的代码安装模块'mutagen'和'gTTS',但我想拥有它,所以它会在没有它们的每台计算机上安装模块,但如果没有它们,它将不会尝试安装它们.他们已经安装好了.我目前有:

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

install('mutagen')

install('gTTS')

from gtts import gTTS
from mutagen.mp3 import MP3
Run Code Online (Sandbox Code Playgroud)

但是,如果您已经拥有这些模块,那么只要您打开它,就会在程序启动时添加不必要的混乱.

小智 17

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

pip list | grep <module_name_you_want_to_check>
Run Code Online (Sandbox Code Playgroud)

这是如何工作的:

pip list
Run Code Online (Sandbox Code Playgroud)

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

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

grep <module_name_you_want_to_check>
Run Code Online (Sandbox Code Playgroud)

从列表中查找关键字。

例子:

pip list| grep quant
Run Code Online (Sandbox Code Playgroud)

列出所有以“quant”开头的包(例如“quantstrats”)。如果您没有任何输出,则表示未安装该库。

  • 请添加一些说明,而不仅仅是代码块 (2认同)

mat*_*n h 16

您可以使用尝试/除外:

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

Run Code Online (Sandbox Code Playgroud)


the*_*ish 11

要检查包是否存在,并在后一种情况下安装它,请尝试使用该pip模块.

要隐藏的输出,你需要为它创建一个函数(在此代码):

from contextlib import contextmanager
import sys, os

@contextmanager
def suppress_stdout():
    with open(os.devnull, "w") as devnull:
        old_stdout = sys.stdout
        sys.stdout = devnull
        try:  
            yield
        finally:
            sys.stdout = old_stdout

import pip

required_pkgs = ['mutagen', 'gTTS']
installed_pkgs = [pkg.key for pkg in pip.get_installed_distributions()]

for package in required_pkgs:
    if package not in installed_pkgs:
        with suppress_stdout():
            pip.main(['install', package])
Run Code Online (Sandbox Code Playgroud)

或者另一种方法是简单地说try except:

import pip

pkgs = ['mutagen', 'gTTS']
for package in pkgs:
    try:
        import package
    except ImportError, e:
        pip.main(['install', package])
Run Code Online (Sandbox Code Playgroud)

就像@zwer提到的那样,上面的工作,虽然它不被视为打包你的项目的正确方法.要更深入地了解这一点,请阅读如何打包Python应用程序页面.

  • 如果有人在他们的代码中使用`import pip`作为正确包装的解决方法,请添加免责声明小猫死亡.-_- (3认同)
  • 另外,我建议不要使用重定向 `sys.stdout`,而是使用 [`subprocess.check_call(args, stdout=subprocess.DEVNULL)`](https://docs.python.org/3/library/subprocess .html#subprocess.check_call) 忽略`pip`的标准输出。 (3认同)

dco*_*les 10

您可以使用以下命令检查软件包是否已安装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))
Run Code Online (Sandbox Code Playgroud)

注意:您不应直接导入该pip模块,因为它是该命令不受支持的用例pip

从您的程序中使用的推荐方法pip是使用以下命令执行它subprocess

subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'my_package'])
Run Code Online (Sandbox Code Playgroud)