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

时间:2017-05-26 22:00:02

标签: python python-3.x module python-module

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

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

install('mutagen')

install('gTTS')

from gtts import gTTS
from mutagen.mp3 import MP3

但是,如果你已经拥有这些模块,只要你打开它就会给程序的开头添加不必要的混乱。

7 个答案:

答案 0 :(得分:10)

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

要隐藏输出,您需要为其创建一个函数(来自此post中的代码):

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])

或者另一种方法是使用简单的try except

import pip

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

就像@zwer提到的那样,上述工作虽然没有被视为打包项目的正确方法。要更深入地查看此内容,请阅读页面How to package a Python App

答案 1 :(得分:8)

您可以使用try / except:

try:
    import time
    print("module 'time' is installed")
except ModuleNotFoundError:
    print("module 'time' is not installed")

答案 2 :(得分:2)

另一种解决方案是为您尝试导入try / except块的任何内容添加import语句,因此如果它已经安装了,但如果没有,它会抛出异常并且您可以运行命令来安装它。

答案 3 :(得分:1)

您可以使用命令行:

python -m MyModule

它会说模块是否存在

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

  

pip freeze> requirements.txt

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

和:

  

pip install -r requirements.txt

加载它们

它将自动为您服务

玩得开心

答案 4 :(得分:0)

pip list | grep <module_name_you_want_to_check>

以上为答案,其中:

pip list

列出所有模块,然后

grep <module_name_you_want_to_check>

从列表中找到关键字。为我工作。

答案 5 :(得分:0)

您可以使用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'])

答案 6 :(得分:0)

您可以运行 pip show package_name 或广角use pip list Reference