Модуль 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, каждый аргумент должен быть отдельной строкой. Передача списка строк, так же будет ошибкой. Модуль sh в качестве параметров поддерживает ключи короткой формы (например -a) и длинной формы (например --arg).
При нормальном завершении процесса запущенной команды терминала, при помощи [модуля sh], код завершения будет иметь значение 0. Если процесс завершается и код выхода не равен 0, то исключение генерируется динамически. Такое поведение модуля позволяет поймать определенный код возврата или поймать вс
Модуль sh может перенаправить STDOUT и STDERR процесса на множество различных типов целей, используя специальные ключевые аргументы _out и _err.
Модуль sh предоставляет несколько методов для выполнения команд и получения выходных данных неблокирующим способом.
Конвейер в стиле Bash выполняется с использованием композиции вызываемых функций. Для этого необходимо передать одну команду в качестве ввода другой, а модуль sh отправит вывод внутренней команды на ввод внешней.
Есть 3 способа использования команды терминала sudo для выполнения команд в скрипте, требующих прав суперпользователя. Они перечислены в порядке полезности и безопасности. В большинстве случаев следует просто использовать вариант sh.contrib.sudo().
В этом разделе попытаемся подключиться к серверу по SSH и программно ввести пароль.
Представленные ниже специальные ключевые аргументы изменяют поведение команды. Они не передаются в программу. Их можно использовать в любой команде, но некоторые из них не могут использоваться вместе. Модуль sh выдаст исключение, если есть конфликты.
Объект RunningCommand представляет собой экземпляр команды, который был запущена или выполняется. Большая часть вашего взаимодействия с объектами модуля sh происходит с экземплярами этого класса.
Объект Command представляет собой программу, которая существует в системе и может быть запущена в определенный момент времени. Экземпляр Command никогда не запускается, для этого создается экземпляр RunningCommand.
В разделе рассмотрены частые вопросы, задаваемые начинающими пользователями модуля sh, которые по каким-то причинам небыли освещены в предыдущих разделах.