Відповіді:
Ви повинні використовувати 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"
Перші два грепи призначені для зняття рядків заголовка з виводу pip3.
Тоді в розрізі вибираються лише назви пакетів (відхилення номерів версій).
Тоді остаточний греп може здійснити точний пошук відповідного $package_name
Якщо пакет знайдеться, він відобразить ім'я пакета та повернеться з кодом виходу 0. Якщо ви не хочете бачити ім'я пакета, закінчіть команду з >/dev/null
в оболонці / підказці Python. :
>>> help('modules')
Тестовано з допомогою pip3:
$> pip3 show MODULENAME
Код виходу ($?) Буде "0" у випадку встановлення модуля, інакше "1".
З прихопленням виникає проблема "помилкових позитивних результатів": вихід a
pip list | grep NAME
відповідатиме будь-якому модулю, ім'я якого містить "NAME", наприклад, також "some_other_NAME".
Поки
pip3 show MODULENAME
тільки матчі на повних матчах.
pip install
. Якщо він уже встановлений, він не буде встановлений знову.