Как проверить, установлен ли модуль или пакет в python3?


10

Необходимо проверить, установлена ​​ли она или нет, прежде чем программа сможет работать.


2
Просто запустите pip install. Если он уже установлен, он не будет установлен снова.
Иордания

Спасибо, Джорданм, но мне нужно проверить и дать A / P, а затем тестирование.
Hubatrix

Ответы:


3

Введите в оболочке: pydoc modules.
Это будет список модулей, и вы можете grep модуль, который вы хотите.
Нашел на stackoverflow здесь


11

Вы должны использовать pip«s listкоманды с Grep, что только списки установленных пакетов (не все модули и их соседи, а):

pip list | grep -F package_name

Если имя_пакета совпадает с несколькими установленными пакетами, например поиск, botoкогда botocoreтакже установлен, то может помочь использование -wвместо -F, как @TaraPrasadGurung предлагает. Это не перечисляет точный пакет, поскольку -wвидит символы, общие в именах пакетов, как границы слов. Так что если у вас есть requestsи requests-cacheустановлен или или ruamel.yamlи ruamel.yaml.cmd` и вам нужна ровно одна строка вывода, вам нужно сделать что-то вроде:

pip list --disable-pip-version-check | grep -E "^ruamel\.yaml "

Обратите внимание, что, так как .соответствует любому символу при использовании -E, вам необходимо его избежать.


¹ И да, это необходимо, поскольку есть пакет ruamel_yaml. Не каждый менеджер пакетов pipсовместим с пакетами пространства имен.


Проблема заключается в том, что если установлены пакеты с именем boto и botocore, они перечислят их обоих. Поэтому лучшим решением будет использование флага -w вместо -F для отображения точного пакета
Tara Prasad Gurung

@TaraPrasadGurung Несмотря на то, что это может помочь несколько уменьшить вывод, это не поможет получить точный пакет, как вы утверждаете. Например, точка и тире воспринимаются -wкак границы слов и являются общими в именах пакетов. Я получаю несколько совпадений, когда использую ваше предложение, используя grep -w ruamel.yamlилиgrep -w request
Anthon

pip list | grep -F mxnet-cu101печатает mxnet-cu101 1.5.0, но не точно, где он установлен. Есть идеи, как получить установленный путь? `
Ану

@any Да, у меня есть хорошая идея, как узнать, где установлен пакет Python, если я знаю его имя. Вам следует опубликовать вопрос на этом сайте и проконсультировать меня здесь, чтобы вы обратили на меня внимание, поскольку я не слежу за недавно опубликованными вопросами на U & L.
Anthon

4

Если пакет не делает ничего сумасшедшего или отнимает много времени при импорте, вы можете попробовать импортировать его:

if python -c "import package_name" &> /dev/null; then
    echo 'all good'
else
    echo 'uh oh'
fi

2

Я нашел существующие ответы неполными и не хватает достаточно хороших примеров. Вот решение, на котором я остановился:

# an example checking if the pandas package is installed
if python -c 'import pkgutil; exit(not pkgutil.find_loader("pandas"))'; then
    echo 'pandas found'
else
    echo 'pandas not found'
fi

Суть этого примера на Github можно найти здесь: https://gist.github.com/shaypal5/d505af9953cd86f59c750fa600ee4ba6


это выглядит очень похоже на существующий ответ
Джефф Шаллер

1
Код bash похож, код Python другой, что очень важно. Я прочитал все существующие ответы, прежде чем добавить свой собственный, и конкретный ответ, с которым вы связались, мне не помог. Таким образом, я считаю уместным и ценным добавить свой ответ здесь. :)
ShayPal5

1

Вы также можете использовать что-то подобное в своих скриптах.

python -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('$Package') else 1)"

Что вы получите, если пакет не установлен.

Package=psutil
python3 -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('$Package') else 1)"
echo $?
1

Что вы получите, когда пакет установлен.

Package=requests
python3 -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('$Package') else 1)"
echo $?
0

Работает в python2 и python3, а затем вы устанавливаете на основе кода выхода.


0

Я использовал более строгую версию ответа Энтона для использования в сценарии:

pip3 list |
    grep -v "^Package *Version$" | grep -v "^-*$" |
    cut -d ' ' -f 1 |
    grep -xF "$package_name"

Первые два greps предназначены для удаления строк заголовка из вывода pip3.

Затем вырезка выбирает только имена пакетов (без номеров версий).

Тогда конечный grep может выполнить точный поиск соответствующих $package_name

Если пакет найден, он отобразит имя пакета и вернется с кодом завершения 0. Если вы не хотите видеть имя пакета, завершите команду командой >/dev/null



0

Протестировано с pip3:

$> pip3 show MODULENAME

Код выхода ($?) Будет равен «0», если модуль установлен, иначе «1».

Греппинг имеет проблему "ложных срабатываний": вывод

pip list | grep NAME

будет соответствовать любому модулю, имя которого содержит «NAME», например, также «some_other_NAME».

Пока

pip3 show MODULENAME

только совпадения на полных совпадениях.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.