Проверьте, установлен ли пакет Python



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



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



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




  • Регистрация для каталога в типичном пути установки

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

469   10  

10 ответов:

Если вы имеете в виду скрипт 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

ответ

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

import pip
installed_packages = pip.get_installed_distributions()

для pip>=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

начиная с 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")

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

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 тоже.

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

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

расширения ответ:

Для 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: [email protected]
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

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

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

Comments

    Ничего не найдено.