Доброго времени суток всем!
29 февраля 2020 года состоялся официальный микро-релиз библиотек smart-env и python-shell. Тем, кто не в курсе, предлагаю предварительно прочитать первый пост.
Если вкратце, то среди изменений — автодополнение команд, расширение возможностей по запуску команд, немного рефакторинга и багфиксов.
За деталями прошу под кат.
Начну сразу с десерта.
Согласитесь — удобно, когда редактор/IDE/терминал подсказывает название команды, а иногда и параметры вызова? Вот и python-shell понемногу продвигается в обеспечении подобного функционала. В связи с тем, что поля класса Shell под капотом de-facto не являются его полями (вездесущий __getattr__), автодополнение создано также с нуля (перегрузкой, соответственно, метода __dir__). В данный момент автодополнение работает средах BPython и IPython. Конечно, хочется увидеть интеграцию с более маститыми продуктами вроде PyCharm, и в этом направлении идет изучение возможностей реализации.
В рамках релиза класс Shell получил новое свойство last_command. Потребность в нем возникла вследствие того, что при генерации исключения ShellException командой с ненулевым кодом возврата объект Command не возвращался из вызова __call__() объекта команды. Теперь же есть возможность сделать так:
Также расширился список свойств объекта Command. Добавлено поле errors, которое возвращает вывод команды в поток ошибок.
Практически в любой системе есть хоть одна программа, название которой не подходит в качестве идентификатора в Python (например, известная утилита 2to3). Вызвать ее с помощью
не получится — интерпретатор не пропустит.
Решение — вызвать команду обходным путем:
Стоит заметить, что таким же образом можно запускать и валидные с точки зрения интерпретатора команды, что оставляет возможность делать гибкие скрипты вроде
В отличие от python-shell, в библиотеке smart-env изменений произошло меньше. Причина тому простая — нехватка свободного времени, в ходе чего некоторые потенциальные улучшения (например, автодополнение переменных окружения) были перенесены на следующий релиз.
По факту, в библиотеке сделаны следующие изменения:
О датах следующих релизов будет дополнительно объявлено в следующих каналах связи:
29 февраля 2020 года состоялся официальный микро-релиз библиотек smart-env и python-shell. Тем, кто не в курсе, предлагаю предварительно прочитать первый пост.
Если вкратце, то среди изменений — автодополнение команд, расширение возможностей по запуску команд, немного рефакторинга и багфиксов.
За деталями прошу под кат.
Что нового в python-shell?
Начну сразу с десерта.
Автодополнение команд
Согласитесь — удобно, когда редактор/IDE/терминал подсказывает название команды, а иногда и параметры вызова? Вот и python-shell понемногу продвигается в обеспечении подобного функционала. В связи с тем, что поля класса Shell под капотом de-facto не являются его полями (вездесущий __getattr__), автодополнение создано также с нуля (перегрузкой, соответственно, метода __dir__). В данный момент автодополнение работает средах BPython и IPython. Конечно, хочется увидеть интеграцию с более маститыми продуктами вроде PyCharm, и в этом направлении идет изучение возможностей реализации.
Добавление свойств
В рамках релиза класс Shell получил новое свойство last_command. Потребность в нем возникла вследствие того, что при генерации исключения ShellException командой с ненулевым кодом возврата объект Command не возвращался из вызова __call__() объекта команды. Теперь же есть возможность сделать так:
try:
command = Shell.touch('/foo.txt')
except ShellException:
command = Shell.last_command
Также расширился список свойств объекта Command. Добавлено поле errors, которое возвращает вывод команды в поток ошибок.
Запуск команд с Python-невалидными именами
Практически в любой системе есть хоть одна программа, название которой не подходит в качестве идентификатора в Python (например, известная утилита 2to3). Вызвать ее с помощью
Shell.2to3()
не получится — интерпретатор не пропустит.
Решение — вызвать команду обходным путем:
Shell("2to3") # возвращает объект команды
Стоит заметить, что таким же образом можно запускать и валидные с точки зрения интерпретатора команды, что оставляет возможность делать гибкие скрипты вроде
cmd = "python{}".format(sys.version_info[0])
Shell(cmd)(*args, **kwargs)
Мелкие изменения
- Реализованы методы __repr__() и __str__() объекта класса Command, которые теперь выдают интуитивно понятные значения (команду с параметрами и ее stdout-выхлоп соответственно).
- Мелкие исправления по коду.
- Добавление покрытия тестами, а также реорганизация существующих.
- Добавление классов Subprocess и Process, цель которых — создание дополнительного уровня абстракции при работе с модулем subprocess. По большей части, необходимо для устранения повторений кода при работе с Python 2/3, но потенциально может и дать и другие бонусы.
Что нового в smart-env?
В отличие от python-shell, в библиотеке smart-env изменений произошло меньше. Причина тому простая — нехватка свободного времени, в ходе чего некоторые потенциальные улучшения (например, автодополнение переменных окружения) были перенесены на следующий релиз.
По факту, в библиотеке сделаны следующие изменения:
- Мелкие исправления по коду.
- Рефакторинг.
- Реорганизация и доработка имеющихся тестов.
Планы по следующим релизам
Библиотека python-shell
- Добавление поддержки неблокирующих вызовов команд (параллелизация выполнения).
Библиотека smart-env
- Реализация автодополнения переменных окружения в классе ENV.
- Поддержка оператора in для проверки существования env-переменной.
- Реализация поддержки функций str() и repr() для класса ENV.
О датах следующих релизов будет дополнительно объявлено в следующих каналах связи:
- Telegram-канал (публичный)
- Апдейтом в данной статье.
delvin-fil
Эммм… Простите, а что есть такого в shell(если это не, скажем, zsh), чего невозможно достичь в Python? Os, subprocess и иже с ними дают сносные результаты.
Допустим, я захотел «пнуть»(зажечь капслед) /dev/input/event12(у меня там виртуальная клавиатура). Как это осуществить без root в python-shell? В os.popen через sudo запросто.
Заинтересуйте меня ;)
albartash Автор
Доброго времени суток!
Ваша претензия интересна по нескольким пунктам, рассмотрим:
Если вы читали предыдущий пост о данных библиотеках, то должны знать, что python-shell и smart-env, по сути, удобные обертки над стандартными os, subprocess, а впоследствии потенциально paramiko, shutil, shlex и др. Удобство заключается в том, что девопсу (да и разработчику) не нужно заморачиваться деталями реализации тех или иных задач на Python, а также уменьшить количество повторений кода. Так что результаты там сносные, но использование библиотек из поста — это как запрашивать сущности из БД через ORM вместо запуска raw-SQL запросов.
Во-первых,
Во-вторых,
З.Ы: использование os.popen() в наше время — моветон. Об этом даже в документации Python написано.
В заключение: библиотеки развиваются, возможностей будет гораздо больше. В данный момент добавляю функционал по неблокирующим вызовам. В будущем можно будет сделать вещи вроде объединения команд через | и перенаправления >,<,>>. Но все постепенно — я за соблюдение чистоты кода, а не «накидать MVP для рынка — потом как-нибудь поправим»: с этих библиотек мне шекели не капают. :)