Проверьте, установлен ли пакет Python
Что это хороший способ, чтобы проверить, если пакет установлен, в то время как в Python-скрипт? Я знаю, что это легко от интерпретатора, но мне нужно сделать это в рамках сценария.
Я думаю, я мог бы проверить, есть ли каталог в системе, которая создана во время установки, но я чувствую, что есть лучший способ. Я пытаюсь убедиться, что пакет Skype4Py установлен, и если нет, я его установлю.
мои идеи для выполнения проверки
- Регистрация для каталога в типичном пути установки
- попробуйте импортировать пакет, и если исключение выбрасывается, то установите пакет
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 $
Comments