Сообщить об ошибке.

Модуль sh в Python, запуск команд терминала как функции

Полноценная замена модуля subprocess в Python

Модуль sh - это полноценная замена модулю Python subprocess (поддержка PyPy3), которая позволяет вызывать любую программу терминала так, как если бы она была функцией. Этот модуль представляет собой обертку над терминалом.

>>> from sh import ifconfig
>>> net_docker = ifconfig('docker0'))

или

>>> import sh
>>> net_docker = sh.ifconfig('docker0')

>>> net_docker
# docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
#         inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
#         ether 02:42:be:1e:35:41  txqueuelen 0  (Ethernet)
#         RX packets 0  bytes 0 (0.0 B)
#         RX errors 0  dropped 0  overruns 0  frame 0
#         TX packets 0  bytes 0 (0.0 B)
#         TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Обратите внимание, что это не функции Python, это запуск бинарных команд терминала, установленных в системе путем динамического разрешения вашего $PATH, как это делает bash, а затем происходит обертывание бинарного файла в функцию. Таким образом, все установленные в систему Linux программы терминала легко доступны из кода Python.

Установка модуля sh в виртуальное окружение:

# создаем виртуальное окружение, если нет
$ python3 -m venv .venv --prompt VirtualEnv
# активируем виртуальное окружение 
$ source .venv/bin/activate
# ставим модуль sh
(VirtualEnv):~$ python -m pip install -U sh

Передача параметров в команды модуля sh в Python

При передаче нескольких аргументов команде терминала, обернутой модулем sh, каждый аргумент должен быть отдельной строкой. Передача списка строк, так же будет ошибкой. Модуль sh в качестве параметров поддерживает ключи короткой формы (например -a) и длинной формы (например --arg).

Коды завершения и исключения модуля sh в Python

При нормальном завершении процесса запущенной команды терминала, при помощи [модуля sh], код завершения будет иметь значение 0. Если процесс завершается и код выхода не равен 0, то исключение генерируется динамически. Такое поведение модуля позволяет поймать определенный код возврата или поймать вс

Перенаправление вывода команды модуля sh в Python

Модуль sh может перенаправить STDOUT и STDERR процесса на множество различных типов целей, используя специальные ключевые аргументы _out и _err.

Фоновое выполнение команды с модулем sh в Python

Модуль sh предоставляет несколько методов для выполнения команд и получения выходных данных неблокирующим способом.

Конвейер в стиле Bash и модуль sh в Python

Конвейер в стиле Bash выполняется с использованием композиции вызываемых функций. Для этого необходимо передать одну команду в качестве ввода другой, а модуль sh отправит вывод внутренней команды на ввод внешней.

Использование sudo c модулем sh в Python

Есть 3 способа использования команды терминала sudo для выполнения команд в скрипте, требующих прав суперпользователя. Они перечислены в порядке полезности и безопасности. В большинстве случаев следует просто использовать вариант sh.contrib.sudo().

Использование ssh с модулем sh в Python

В этом разделе попытаемся подключиться к серверу по SSH и программно ввести пароль.

Специальные ключевые аргументы модуля sh в Python

Представленные ниже специальные ключевые аргументы изменяют поведение команды. Они не передаются в программу. Их можно использовать в любой команде, но некоторые из них не могут использоваться вместе. Модуль sh выдаст исключение, если есть конфликты.

Объект запущенной команды модуля sh в Python

Объект RunningCommand представляет собой экземпляр команды, который был запущена или выполняется. Большая часть вашего взаимодействия с объектами модуля sh происходит с экземплярами этого класса.

Класс Command() модуля sh в Python

Объект Command представляет собой программу, которая существует в системе и может быть запущена в определенный момент времени. Экземпляр Command никогда не запускается, для этого создается экземпляр RunningCommand.

Частые вопросы по модулю sh в Python

В разделе рассмотрены частые вопросы, задаваемые начинающими пользователями модуля sh, которые по каким-то причинам небыли освещены в предыдущих разделах.