Проверьте, существует ли модуль, если он не установлен.

Я хочу проверить, существует ли модуль, если он не хочет его устанавливать.

Как мне это сделать?

До сих пор у меня есть этот код, который правильно печатает f, если модуль не существует.

try:
    import keyring
except ImportError:
    print 'f'

Ответы

Ответ 1

Вот как это должно быть сделано, и если я ошибаюсь, пожалуйста, поправьте меня. Тем не менее, Нуфаль, похоже, подтверждает это в другом ответе на этот вопрос, поэтому, я думаю, это правильно.

При написании setup.py script для некоторых сценариев, которые я написал, я был зависим от диспетчера пакетов моего дистрибутива, чтобы установить для меня нужную библиотеку.

Итак, в моем setup.py файле я сделал это:

package = 'package_name'
try:
    return __import__(package)
except ImportError:
    return None

Итак, если package_name был установлен, отлично, продолжайте. Else, установите его через менеджер пакетов, который я вызвал, используя subprocess.

Ответ 2

import pip

def import_or_install(package):
    try:
        __import__(package)
    except ImportError:
        pip.main(['install', package])       

Этот код просто пытается импортировать пакет, где пакет имеет тип str, и если он неспособен, вызовет pip и попытается установить его там.

Ответ 3

Этот подход динамического импорта работает очень хорошо в случаях, когда вы просто хотите распечатать сообщение, если модуль не установлен. Автоматическая установка модуля ДОЛЖНА выполняться как выдача пипса через subprocess. Поэтому у нас есть setuptools (или распространение).

У нас есть несколько отличных руководств по упаковке, а задача обнаружения/установки зависимостей проста, чем предоставление install_requires=[ 'FancyDependency', 'otherFancy>=1.0' ]. Это просто!

Но если вы действительно NEED, чтобы сделать это вручную, вы можете использовать setuptools, чтобы помочь вам.

from pkg_resources import WorkingSet , DistributionNotFound
working_set = WorkingSet()

# Printing all installed modules
print tuple(working_set)

# Detecting if module is installed
try:
    dep = working_set.require('paramiko>=1.0')
except DistributionNotFound:
    pass

# Installing it (anyone knows a better way?)
from setuptools.command.easy_install import main as install
install(['django>=1.2'])

Ответ 4

Вы можете запустить pip install %s"%keyring в другой части, чтобы сделать это, но я не рекомендую его. Правильный способ заключается в том, чтобы упаковать ваше приложение, используя distutils, чтобы при его установке зависали.

Ответ 5

Не все модули могут быть установлены так легко. Не у всех из них есть простая установка, некоторые из них могут быть установлены только путем их создания. Другие требуют некоторых предварительных условий, отличных от python, таких как gcc, что делает вещи еще более сложными (и забывает, что это хорошо работает в Windows).

Итак, я бы сказал, что вы, вероятно, могли бы работать над некоторыми предопределенными модулями, но нет никаких шансов, что это будет нечто общее, что работает для любого модуля.

Ответ 6

Вы можете использовать os.system следующим образом:

import os

package = "package_name"

try:
    __import__package
except:
    os.system("pip install "+ package)