Найти тему
Nuances of programming

Создание GUI PyWebIO для удаления пакетов Python

Оглавление

Источник: Nuances of Programming

Как правило, эксперименты с новыми проектами заканчиваются установкой множества библиотек 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

Браузер автоматически открывается, и мы видим вот такую страницу:

Скриншот GUI менеджера пакетов
Скриншот GUI менеджера пакетов

А самая главная особенность этого раскрывающегося списка в том, что он включает встроенную функцию автоматического выбора, которая значительно облегчает поиск. Достаточно лишь ввести первые буквы имени пакета, и он автоматически выбирается:

Поиск пакета на букву P
Поиск пакета на букву P

Я знаю, что пакет pipman мне больше не понадобится. Поэтому я его удаляю, нажав на “Submit”:

Удаление пакета
Удаление пакета

При проверке окна терминала вы видите такой вывод:

Found existing installation: pipman 0.0.3 Uninstalling pipman-0.0.3:
Successfully uninstalled pipman-0.0.3

Отлично! Обратите внимание, что мы обошлись без запроса на подтверждение удаления пакета, но при этом он был успешно удален.

Заключение

Из этого краткого руководства вы узнали:

  • как с помощью библиотеки PyWebIO можно создать GUI в несколько строк кода;
  • как удалять пакеты Python из скрипта;
  • как с помощью библиотеки asyncio вызывать асинхронную функцию.

Отображение пакетов в браузере предоставляет возможность лучшего просмотра.

Надеюсь, информация была для вас полезной. Благодарю за внимание. Программируйте всем на радость!

Читайте также:

Читайте нас в Telegram, VK

Перевод статьи Kirshi Yin: How To Easily Uninstall Python Packages Through a PyWebIO GUI