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

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

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

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

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


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

Предыдущая статьяВек программируй, век учись
Следующая статьяЗапуск тестовых сценариев с Maven