Як перевірити, чи модуль або пакет уже встановлено в python3?


10

Потрібно перевірити, встановлений він чи ні до запуску програми.


2
Просто запустіть pip install. Якщо він уже встановлений, він не буде встановлений знову.
Йорданм

Думаю, ви Йорданія, але мені потрібно перевірити і дати ао / р, потім тестування.
hubatrix

Відповіді:


3

Введіть в оболонці: pydoc modules.
У цьому списку будуть перераховані модулі, і ви зможете перехопити потрібний модуль
Тут можна знайти тут


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
Антон,

pip list | grep -F mxnet-cu101друкує mxnet-cu101 1.5.0, але не точно там, де він встановлений. будь-яка ідея, як отримати встановлений шлях? `
Ану

@any Так, у мене є гарна ідея, як знайти, де встановлений пакет Python, якщо я знаю його ім'я. Ви повинні залишити питання на цьому веб-сайті та подати мені сюди пильну увагу, коли ви це робите, оскільки я не слідкую за нещодавно розміщеними питаннями щодо U&L.
Антон

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"

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

Тоді в розрізі вибираються лише назви пакетів (відхилення номерів версій).

Тоді остаточний греп може здійснити точний пошук відповідного $package_name

Якщо пакет знайдеться, він відобразить ім'я пакета та повернеться з кодом виходу 0. Якщо ви не хочете бачити ім'я пакета, закінчіть команду з >/dev/null



0

Тестовано з допомогою pip3:

$> pip3 show MODULENAME

Код виходу ($?) Буде "0" у випадку встановлення модуля, інакше "1".

З прихопленням виникає проблема "помилкових позитивних результатів": вихід a

pip list | grep NAME

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

Поки

pip3 show MODULENAME

тільки матчі на повних матчах.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.