Ответы:
Вы должны использовать 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
. Если он уже установлен, он не будет установлен снова.