Вопрос

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

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

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

  • проверьте наличие каталога в обычном пути установки
  • попробуйте импортировать пакет, и если возникает исключение throw, то установите package
Это было полезно?

Решение

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

try:
 import mymodule
except ImportError, e:
 pass # module doesn't exist, deal with it.

Другие советы

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

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

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

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

Старый ответ

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

import pip
installed_packages = pip.get_installed_distributions()

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

from pip._internal.utils.misc import get_installed_distributions

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

В результате вы получите список 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

Начиная с Python 3.3, вы можете использовать find_spec() найти 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")

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

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

В качестве расширения этот ответ:

Для 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

Вы можете использовать модуль 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.Пакет может содержать несколько модулей, и имена модулей могут не совпадать с именем пакета.

Я хотел бы добавить некоторые свои мысли / выводы к этой теме.Я пишу скрипт, который проверяет все требования к пользовательской программе.Существует также множество проверок с модулями 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 вместо этого (с этим легко смириться), но в этом случае модуль вообще не будет загружен в память.

Если вы хотите, чтобы ваш скрипт установил недостающие пакеты и продолжил работу, вы могли бы сделать что-то вроде этого (на примере модуля '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))

Быстрый способ - это использовать питон инструмент командной строки.Просто введите 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
$

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top