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



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

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

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


Поиск пакета на букву 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 вызывать асинхронную функцию. 

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


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


1086   0  

Comments

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