Ответы:
Вы должны использовать 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совместим с пакетами пространства имен.
-wкак границы слов и являются общими в именах пакетов. Я получаю несколько совпадений, когда использую ваше предложение, используя grep -w ruamel.yamlилиgrep -w request
pip list | grep -F mxnet-cu101печатает mxnet-cu101 1.5.0, но не точно, где он установлен. Есть идеи, как получить установленный путь? `
Я нашел существующие ответы неполными и не хватает достаточно хороших примеров. Вот решение, на котором я остановился:
# 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
Вы также можете использовать что-то подобное в своих скриптах.
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, а затем вы устанавливаете на основе кода выхода.
Я использовал более строгую версию ответа Энтона для использования в сценарии:
pip3 list |
grep -v "^Package *Version$" | grep -v "^-*$" |
cut -d ' ' -f 1 |
grep -xF "$package_name"
Первые два greps предназначены для удаления строк заголовка из вывода pip3.
Затем вырезка выбирает только имена пакетов (без номеров версий).
Тогда конечный grep может выполнить точный поиск соответствующих $package_name
Если пакет найден, он отобразит имя пакета и вернется с кодом завершения 0. Если вы не хотите видеть имя пакета, завершите команду командой >/dev/null
в оболочке / приглашении Python. :
>>> help('modules')
Протестировано с pip3:
$> pip3 show MODULENAME
Код выхода ($?) Будет равен «0», если модуль установлен, иначе «1».
Греппинг имеет проблему "ложных срабатываний": вывод
pip list | grep NAME
будет соответствовать любому модулю, имя которого содержит «NAME», например, также «some_other_NAME».
Пока
pip3 show MODULENAME
только совпадения на полных совпадениях.
pip install. Если он уже установлен, он не будет установлен снова.