Проверьте, установлен ли пакет Python - PullRequest
83 голосов
/ 27 июня 2009

Какой хороший способ проверить, установлен ли пакет в скрипте Python? Я знаю, что это легко от переводчика, но мне нужно сделать это в сценарии.

Полагаю, я мог бы проверить, есть ли в системе каталог, созданный во время установки, но я чувствую, что есть лучший способ. Я пытаюсь убедиться, что пакет Skype4Py установлен, и если нет, я его установлю.

Мои идеи для выполнения проверки

  • проверить каталог в типичном пути установки
  • попробуйте импортировать пакет и, если исключение - throw, то установить пакет

Ответы [ 10 ]

83 голосов
/ 27 июня 2009

Если вы имеете в виду скрипт на python, просто сделайте что-то вроде этого:

try:
 import mymodule
except ImportError, e:
 pass # module doesn't exist, deal with it.
43 голосов
/ 16 декабря 2014

Обновленный ответ

Лучший способ сделать это:

import subprocess
import sys

reqs = subprocess.check_output([sys.executable, '-m', 'pip', 'freeze'])
installed_packages = [r.decode().split('==')[0] for r in reqs.split()]

Результат:

print(installed_packages)

[
    "Django",
    "six",
    "requests",
]

Проверьте, установлен ли requests:

if 'requests' in installed_packages:
    # Do something

Почему так? Иногда вы сталкиваетесь с именами приложений. Импорт из пространства имен приложения не дает полной картины того, что установлено в системе.

Старый ответ

Лучший способ сделать это:

import pip
installed_packages = pip.get_installed_distributions()

Для пунктов> = 10.x используйте:

from pip._internal.utils.misc import get_installed_distributions

Почему так? Иногда вы сталкиваетесь с именами приложений. Импорт из пространства имен приложения не дает полной картины того, что установлено в системе.

В результате вы получите список pkg_resources.Distribution объектов. В качестве примера смотрите следующее:

print installed_packages
[
    "Django 1.6.4 (/path-to-your-env/lib/python2.7/site-packages)",
    "six 1.6.1 (/path-to-your-env/lib/python2.7/site-packages)",
    "requests 2.5.0 (/path-to-your-env/lib/python2.7/site-packages)",
]

Составьте список:

flat_installed_packages = [package.project_name for package in installed_packages]

[
    "Django",
    "six",
    "requests",
]

Проверьте, установлен ли requests:

if 'requests' in flat_installed_packages:
    # Do something
17 голосов
/ 19 сентября 2017

Если вы хотите получить чек с терминала, вы можете запустить

pip3 show package_name

и если ничего не возвращается, пакет не устанавливается.

Если, возможно, вы захотите автоматизировать эту проверку, чтобы, например, вы могли установить ее, если она отсутствует, в вашем bash-скрипте может быть следующее:

pip3 show package_name 1>/dev/null #pip for Python 2
if [ $? == 0 ]; then
   echo "Installed" #Replace with your actions
else
   echo "Not Installed" #Replace with your actions, 'pip3 install --upgrade package_name' ?
fi
16 голосов
/ 24 января 2017

Начиная с Python 3.3, вы можете использовать find_spec () метод

import importlib.util
import sys

# For illustrative purposes.
package_name = 'pandas'

spec = importlib.util.find_spec(package_name)
if spec is None:
    print(package_name +" is not installed")
5 голосов
/ 05 июля 2018

Как расширение этот ответ :

Для Python 2. *, pip show <package_name> выполнит ту же задачу.

Например, pip show numpy вернет следующее или подобное:

Name: numpy
Version: 1.11.1
Summary: NumPy: array processing for numbers, strings, records, and objects.
Home-page: http://www.numpy.org
Author: NumPy Developers
Author-email: numpy-discussion@scipy.org
License: BSD
Location: /home/***/anaconda2/lib/python2.7/site-packages
Requires: 
Required-by: smop, pandas, tables, spectrum, seaborn, patsy, odo, numpy-stl, numba, nfft, netCDF4, MDAnalysis, matplotlib, h5py, GridDataFormats, dynd, datashape, Bottleneck, blaze, astropy
2 голосов
/ 20 августа 2018

Вы можете использовать модуль pkg_resources из setuptools. Например:

import pkg_resources

package_name = 'cool_package'
try:
    cool_package_dist_info = pkg_resources.get_distribution(package_name)
except pkg_resources.DistributionNotFound:
    print('{} not installed'.format(package_name))
else:
    print(cool_package_dist_info)

Обратите внимание, что существует разница между модулем python и пакетом python. Пакет может содержать несколько модулей, а имена модулей могут не совпадать с именем пакета.

1 голос
/ 07 сентября 2017

Я хотел бы добавить некоторые мысли / выводы к этой теме. Я пишу сценарий, который проверяет все требования для программы на заказ Есть много проверок и с модулями python.

Есть небольшая проблема с

try:
   import ..
except:
   ..

решение. В моем случае один из модулей python называется python-nmap, но вы импортируете его с import nmap, и, как видите, несоответствия имен. Поэтому тест с вышеупомянутым решением возвращает ложный результат, а также импортирует модуль при попадании, но, возможно, нет необходимости использовать много памяти для простого теста / проверки.

Я также обнаружил, что

import pip
installed_packages = pip.get_installed_distributions()

installed_packages будет иметь , только пакеты установлены с pip . В моей системе pip freeze возвращает более 40 модулей Python, в то время как installed_packages имеет только 1, тот, который я установил вручную (python-nmap).

Другое нижеприведенное решение, которое я знаю , возможно, не относится к вопросу , но я думаю, что это хорошая практика - держать тестовую функцию отдельно от той, которая выполняет ее установку. может быть полезно для некоторых.

Решение, которое сработало для меня. Он основан на этом ответе Как проверить, существует ли модуль Python, не импортируя его

from imp import find_module

def checkPythonmod(mod):
    try:
        op = find_module(mod)
        return True
    except ImportError:
        return False

ПРИМЕЧАНИЕ: это решение не может найти модуль с именем python-nmap, я должен использовать вместо него nmap (легко жить), но в этом случае модуль не будет загружен в память вообще .

0 голосов
/ 20 сентября 2018

Быстрый способ - использовать инструмент командной строки python . Просто наберите import <your module name> Вы видите ошибку, если модуль отсутствует.

$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
>>> import sys
>>> import jocker
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named jocker
$
0 голосов
/ 02 февраля 2018

Если вы хотите, чтобы ваш скрипт установил недостающие пакеты и продолжил, вы можете сделать что-то вроде этого (на примере модуля 'krbV' в пакете 'python-krbV'):

import pip
import sys

for m, pkg in [('krbV', 'python-krbV')]:
    try:
        setattr(sys.modules[__name__], m, __import__(m))
    except ImportError:
        pip.main(['install', pkg])
        setattr(sys.modules[__name__], m, __import__(m))
0 голосов
/ 27 июня 2009

Перейти вариант № 2. Если выброшено ImportError, то пакет не установлен (или отсутствует в sys.path).

...