Как правило, эксперименты с новыми проектами заканчиваются установкой множества библиотек Python. В связи с этим периодически возникает необходимость их чистить, удаляя старые и уже ненужные. Как правило, для получения информации об установленных пакетах выполняется команда pip list
. В итоге выдается очень длинный список, который затрудняет поиск требуемых из них. Да и предоставляемый формат просмотра пакетов оставляет желать лучшего.
Для решения этой проблемы предлагаю создать простой GUI, используя библиотеку PyWebIO. Он отобразит все установленные пакеты, и нам не составит труда выбрать из них те, что следует удалить.
Итак, приступим!
Создание GUI
Библиотека PyWebIO предназначена для создания простых веб-приложений. Она не требует знания HTML или JavaScript.
У меня был опыт создания программы проверки японского произношения с помощью Streamlit, еще одной библиотеки для создания веб-приложений. Так вот, по сравнению с ней PyWebIO обладает большими преимуществами, поскольку предоставляет многообразие опций для настройки приложений.
Устанавливаем библиотеку посредством pip
или pip3
:
pip3 install pywebio
Создаем новый файл Python и вставляем следующий код:
from pywebio.output import *
from pywebio.input import *
from pip import _internal
from pip._internal.utils.misc import get_installed_distributions
import time
import asyncio
put_markdown('Pip Package Manager')
installed_packages = get_installed_distributions()
installed_packages_set = { package for package in ["%s==%s" % (i.key, i.version)
for i in installed_packages] }
async def uninstall(package):
_internal.main(['uninstall', '-y', package])
async def main(package):
task = asyncio.create_task(uninstall(package))
completed = False
counter = 1
put_text(f"Uninstalling {package}. Please wait until it is removed!")
put_processbar('bar')
while not completed:
counter+=counter
await asyncio.sleep(1)
# если задача выполняется слишком долго, перезапускаем счетчик
if counter > 10:
counter = 1
if task.done():
completed = True
counter = 10
put_markdown(f"Successfully uninstalled {package}")
else:
print("waiting...")
set_processbar('bar', counter / 10)
package = select("Choose a package to uninstall", sorted(installed_packages_set))
print("you chose to remove", package)
asyncio.run(main(package))
- Импортируем требуемые пакеты.
- Функция
get_installed_distributions()
возвращает все установленные пакеты. - Чтобы получить удобочитаемый вывод, создаем
set
для хранения имени пакета и установленной версии. - Все самое интересное происходит здесь:
_internal.main(['uninstall', '-y', package])
. Эта строка равнозначна выполнению команды:
pip uninstall -y packagename
Обратите внимание, что аргумент -y ( — yes)
позволяет обойтись без запроса на удаление.
- Добавляем приложению изящный нюанс, отображая индикатор выполнения посредством типа вывода
put_progressbar
. Я применяю сопрограмму (coroutine) из библиотеки asyncio для ожидания завершения задачи по деинсталляции. С учетом этого будет обновляться индикатор выполнения. - С помощью типа ввода
select
отображаем раскрывающееся меню, которое содержит отсортированные в алфавитном порядке пакеты. - И наконец, показываем сообщение о том, что удаление пакета завершено.
Теперь выполняем код:
python3 remove_packages.py
Браузер автоматически открывается, и мы видим вот такую страницу:
А самая главная особенность этого раскрывающегося списка в том, что он включает встроенную функцию автоматического выбора, которая значительно облегчает поиск. Достаточно лишь ввести первые буквы имени пакета, и он автоматически выбирается:
Я знаю, что пакет pipman
мне больше не понадобится. Поэтому я его удаляю, нажав на “Submit”:
При проверке окна терминала вы видите такой вывод:
Found existing installation: pipman 0.0.3
Uninstalling pipman-0.0.3:
Successfully uninstalled pipman-0.0.3
Отлично! Обратите внимание, что мы обошлись без запроса на подтверждение удаления пакета, но при этом он был успешно удален.
Заключение
Из этого краткого руководства вы узнали:
- как с помощью библиотеки PyWebIO можно создать GUI в несколько строк кода;
- как удалять пакеты Python из скрипта;
- как с помощью библиотеки
asyncio
вызывать асинхронную функцию.
Отображение пакетов в браузере предоставляет возможность лучшего просмотра.
Надеюсь, информация была для вас полезной. Благодарю за внимание. Программируйте всем на радость!
Читайте также:
- Наследование и полиморфизм в Python
- 9 странностей Python для C++ программистов
- Планы на отпуск с Python и HERE Maps
Читайте нас в Telegram, VK и Дзен
Перевод статьи Kirshi Yin: How To Easily Uninstall Python Packages Through a PyWebIO GUI