Проверьте, существует ли модуль, если не установлен - PullRequest
21 голосов
/ 24 декабря 2010

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

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

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

try:
    import keyring
except ImportError:
    print 'f'

Ответы [ 5 ]

17 голосов
/ 22 июня 2016
import pip

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

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

12 голосов
/ 24 декабря 2010

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

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

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

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

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

10 голосов
/ 25 декабря 2010

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

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

Но, если вам действительно НУЖНО сделать вручную, вы можете использовать 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'])
1 голос
/ 24 декабря 2010

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

0 голосов
/ 24 декабря 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...