Проверьте, существует ли модуль, если не установлен
Я хочу проверить, существует ли модуль, если нет, я хочу установить его.
Как мне это сделать?
Пока у меня есть этот код, который правильно печатает f
если модуль не существует
try:
import keyring
except ImportError:
print 'f'
12 ответов
Вот как это должно быть сделано, и если я ошибаюсь, поправьте меня. Тем не менее, Нуфал, кажется, подтверждает это в другом ответе на этот вопрос, поэтому я думаю, что это правильно.
При написании setup.py
Сценарий для некоторых сценариев, которые я написал, я зависел от менеджера пакетов моего дистрибутива, чтобы установить необходимую мне библиотеку.
Итак, по моему setup.py
файл, я сделал это:
package = 'package_name'
try:
return __import__(package)
except ImportError:
return None
Так что если package_name
был установлен, хорошо, продолжить. Иначе, установите его через менеджер пакетов, который я назвал с помощью subprocess
,
import pip
def import_or_install(package):
try:
__import__(package)
except ImportError:
pip.main(['install', package])
Этот код просто пытается импортировать пакет, где пакет имеет тип str, и, если это невозможно, вызывает pip и пытается установить его оттуда.
ПРИМЕЧАНИЕ. Специальное решение для Ipython / Jupyter.
При использовании ноутбуков / онлайн-ядер я обычно использую системный вызов.
try:
import keyring
except:
!pip install pulp
import keyring
Этот подход динамического импорта работает очень хорошо в тех случаях, когда вы просто хотите напечатать сообщение, если модуль не установлен. Автоматическая установка модуля НЕ ДОЛЖНА выполняться как выдача pip через subprocess
, Вот почему у нас есть setuptools (или распространяем).
У нас есть несколько отличных руководств по упаковке, и задача обнаружения / установки зависимостей так же проста, как обеспечение install_requires=[ 'FancyDependency', 'otherFancy>=1.0' ]
, Вот и все!
Но, если вам действительно нужно сделать вручную, вы можете использовать setuptools
чтобы помочь вам.
from pkg_resources import WorkingSet , DistributionNotFound
working_set = WorkingSet()
# Printing all installed modules
print tuple(working_set)
# Detecting if module is installed
try:
dep = working_set.require('paramiko>=1.0')
except DistributionNotFound:
pass
# Installing it (anyone knows a better way?)
from setuptools.command.easy_install import main as install
install(['django>=1.2'])
Вы можете использовать os.system
следующее:
import os
package = "package_name"
try:
__import__package
except:
os.system("pip install "+ package)
Вот мой подход. Идея заключается в цикле до тех пор, пока python не установит все модули с помощью встроенного модуля как «pip».
import pip
while True:
try:
#import your modules here. !
import seaborn
import bokeh
break
except ImportError as err_mdl:
print((err_mdl.name))
pip.main(['install', err_mdl.name])
Я сделал import_neccessary_modules()
функция для устранения этой распространенной проблемы.
# ======================================================================================
# == Fix any missing Module, that need to be installed with PIP.exe. [Windows System] ==
# ======================================================================================
import importlib, os
def import_neccessary_modules(modname:str)->None:
'''
Import a Module,
and if that fails, try to use the Command Window PIP.exe to install it,
if that fails, because PIP in not in the Path,
try find the location of PIP.exe and again attempt to install from the Command Window.
'''
try:
# If Module it is already installed, try to Import it
importlib.import_module(modname)
print(f"Importing {modname}")
except ImportError:
# Error if Module is not installed Yet, the '\033[93m' is just code to print in certain colors
print(f"\033[93mSince you don't have the Python Module [{modname}] installed!")
print("I will need to install it using Python's PIP.exe command.\033[0m")
if os.system('PIP --version') == 0:
# No error from running PIP in the Command Window, therefor PIP.exe is in the %PATH%
os.system(f'PIP install {modname}')
else:
# Error, PIP.exe is NOT in the Path!! So I'll try to find it.
pip_location_attempt_1 = sys.executable.replace("python.exe", "") + "pip.exe"
pip_location_attempt_2 = sys.executable.replace("python.exe", "") + "scripts\pip.exe"
if os.path.exists(pip_location_attempt_1):
# The Attempt #1 File exists!!!
os.system(pip_location_attempt_1 + " install " + modname)
elif os.path.exists(pip_location_attempt_2):
# The Attempt #2 File exists!!!
os.system(pip_location_attempt_2 + " install " + modname)
else:
# Neither Attempts found the PIP.exe file, So i Fail...
print(f"\033[91mAbort!!! I can't find PIP.exe program!")
print(f"You'll need to manually install the Module: {modname} in order for this program to work.")
print(f"Find the PIP.exe file on your computer and in the CMD Command window...")
print(f" in that directory, type PIP.exe install {modname}\033[0m")
exit()
import_neccessary_modules('art')
import_neccessary_modules('pyperclip')
import_neccessary_modules('winsound')
Не все модули могут быть установлены так легко. Не у всех из них есть поддержка простой установки, некоторые могут быть установлены только путем их сборки... другим требуются некоторые не-python предварительные условия, такие как gcc, что делает вещи еще более сложными (и забудьте о том, что это хорошо работает в Windows).
Так что я бы сказал, что вы, вероятно, могли бы заставить его работать для некоторых предопределенных модулей, но нет никаких шансов, что это будет что-то общее, что работает для любого модуля.
Вы можете запустить pip install %s"%keyring
в исключительной части, чтобы сделать это, но я не рекомендую это. Правильный способ состоит в том, чтобы упаковать ваше приложение с помощью distutils, чтобы при его установке были извлечены зависимости.
Я попытался установить трансформаторы, используя описанный ниже метод, и он работал нормально. Точно так же вы можете просто заменить имя своей библиотеки вместо «трансформеры».
import pip
try:
from transformers import pipeline
except ModuleNotFoundError:
pip.main(['install', "transformers"])
from transformers import pipeline
Я попробовал это в новой виртуальной среде без установленных пакетов, и он установил необходимый пакет, т.е.
opencv-python
Пример приведен ниже
import os
try:
import cv2
except ImportError:
os.system('pip install opencv-python')
Чтобы воспроизвести этот код, сначала необходимо установить библиотеку instld .
try:
import some_module
except ImportError:
import installed
with installed('some_package'):
import some_module
Здесь мы сначала пытаемся импортировать модуль, а в случае ошибки устанавливаем его прямо во время выполнения, а затем импортируем.