Повторяющиеся задачи созрели для автоматизации. Разработчики и системные администраторы обычно автоматизируют рутинные задачи, такие как проверки работоспособности и резервное копирование файлов, с помощью сценариев оболочки. Однако, поскольку эти задачи становятся более сложными, сценарии оболочки могут усложняться в обслуживании.
К счастью, мы можем использовать Python вместо сценариев оболочки для автоматизации. Python предоставляет методы для запуска команд оболочки, предоставляя нам ту же функциональность, что и сценарии оболочки. Изучение того, как выполнять команды оболочки в Python, открывает нам возможность автоматизировать компьютерные задачи структурированным и масштабируемым образом.
В этой статье мы рассмотрим различные способы выполнения команд оболочки в Python и идеальную ситуацию для использования каждого метода.
Использование os.system для запуска команды
Python позволяет нам немедленно выполнить команду оболочки, которая хранится в строке, используя функцию os.system() .
Python для начинающих / Урок 6.1. Как запускать python-программы в Windows
Давайте начнем с создания нового файла Python с именем echo_adelle.py и введите следующее:
import os os.system(«echo Hello from the other side!»)
Первое, что мы делаем в нашем Python файле, это импортируем модуль os , который содержит функцию system , которая может выполнять команды оболочки. Следующая строка делает именно это, запускает команду echo в нашей оболочке через Python.
В вашем терминале запустите этот файл с помощью следующей команды, и вы должны увидеть соответствующий вывод:
$ python3 echo_adelle.py Hello from the other side!
По мере того, как команды echo выводятся в наш stdout , os.system() также возвращает код завершения команды оболочки. Код 0 означает, что он работает без проблем, а любое другое число означает ошибку.
Давайте создадим новый файл с именем cd_return_codes.py и введите следующее:
import os home_dir = os.system(«cd ~») print(«`cd ~` ran with exit code %d» % home_dir) unknown_dir = os.system(«cd doesnotexist») print(«`cd doesnotexis` ran with exit code %d» % unknown_dir)
В этом сценарии мы создаем две переменные, в которых хранятся результаты выполнения команд, которые изменяют каталог на домашнюю папку и на несуществующую папку. Запустив этот файл, мы увидим:
$ python3 cd_return_codes.py `cd ~` ran with exit code 0 sh: line 0: cd: doesnotexist: No such file or directory `cd doesnotexist` ran with exit code 256
Первая команда, которая изменяет каталог на домашний каталог, выполняется успешно. Следовательно, os.system() возвращает код ноль, который хранится в home_dir . С другой стороны, unknown_dir сохраняет код завершения неудачной команды bash, чтобы изменить каталог на несуществующую папку.
Функция os.system() выполняет команду, печатает любой вывод команды на консоль и возвращает код завершения команды. Если нам нужно более детальное управление вводом и выводом команды оболочки в Python, мы должны использовать модуль subprocess .
Как выполнить Python код с правами Администратора?!
Выполнение команды с подпроцессом
Модуль subprocess — это рекомендуемый Python способ выполнения команд оболочки. Это дает нам гибкость для подавления вывода команд оболочки или цепочки входов и выходов различных команд вместе, в то же время обеспечивая аналогичный опыт os.system() для базовых сценариев использования.
В новом файле с именем list_subprocess.py напишите следующий код:
import subprocess list_files = subprocess.run([«ls», «-l»]) print(«The exit code was: %d» % list_files.returncode)
В первой строке мы импортируем модуль subprocess , который является частью стандартной библиотеки Python. Затем мы используем функцию subprocess.run() для выполнения команды. Также как и команда os.system() , subprocess.run() возвращает код того, что было выполнено.
Обратите внимание, что subprocess.run() принимает список строк в качестве входных данных вместо одной строки. Первым элементом списка является название команды. Остальные пункты списка — это флаги и аргументы команды.
Примечание: Как правило, вам нужно отделить аргументы , основанные на пространстве, например , ls -alh будет [«ls», «-alh»] , а ls -a -l -h , превратится в [«ls», «-a», -«l», «-h»] .
Запустите этот файл, и вывод вашей консоли будет похож на:
Теперь давайте попробуем использовать одну из более продвинутых функций subprocess.run() , а именно игнорирование вывода в stdout . В том же файле list_subprocess.py измените:
list_files = subprocess.run([«ls», «-l»])
list_files = subprocess.run([«ls», «-l»], stdout=subprocess.DEVNULL)
Стандартный вывод команды теперь передается на специальное устройство /dev/null , что означает, что вывод не будет отображаться на наших консолях. Запустите файл в вашей оболочке, чтобы увидеть следующий вывод:
$ python3 list_subprocess.py The exit code was: 0
Что если мы хотим получить результат команды? subprocess.run() поможет сделать это. Создайте новый файл с именем cat_subprocess.py , набрав следующее:
import subprocess useless_cat_call = subprocess.run([«cat»], stdout=subprocess.PIPE, text=True, input=»Hello from the other side») print(useless_cat_call.stdout) # Hello from the other side
Установка и запуск Python3 на Windows и MAC OS
Прежде, чем приступить к занятиям, нужно выполнить подготовительную работу, которая нужна, чтобы начать программировать на Python.
В частности, нужно установить интерпретатор Python в вашей операционной системе и проработать цикл написания, сохранения и запуска программы. В качестве программы для тренировки мы возьмем одну строчку кода – print(‘Hello, Python’)
Совет. Создайте специальную директорию, в которой будут находится файлы с кодом python. Файлы с кодом python имеют расширение .py. Постарайтесь называть файлы так, чтобы было понятно, что в них находится. Если через какое-то время вам нужно будет вернуться к примерам или задачам, это сильно поможет.
Установка интерпретатора Python
Внимание! Мы будем изучать Python3, поэтому устанавливать нужно Python3.
Шаг1. Проверить, установлен ли Python3
Прежде всего нужно проверить, установлен ли Python3 на Вашем компьютере. Для этого в командной строке наберите
>python3
Windows и другие:
>python
Подсказка:
1. Если вы не знаете, как попасть в командную строку –смотрите здесь.
2. В Windows в качестве альтернативы командной строке можно использовать PowerShell
Если Python установлен, то вы увидите что-то вроде этого
Вы увидите версию установленного Python. Если это версия 3.x– то ничего делать не нужно, можно сразу перейти к установке редактора.
Как запустить небольшой код Python в Bash
Bash — это не только и даже не столько встроенные функции оболочки сколько программы (утилиты) командной строки. Запуская эти команды и передавая полученные данные конвейеру (по трубе) можно автоматизировать самые различные вещи, на программирование которых в других языках программирования может понадобиться очень много усилий.
Эта заметка расскажет, как запустить код Python в Bash, а также как в скрипте Bash запустить выполнение программы на Python
Как выполнить код Python в Bash
В командной строке Bash для выполнения кода используйте конструкцию вида:
python -c «КОД»
python -c «print («It works»)»
Ещё один вариант, который может пригодиться в более экзотических обстоятельствах:
bash -c ‘python -c «print («КОД»)»‘
bash -c ‘python -c «print («It works»)»‘
Как в скрипте Bash запустить программу на Python
Для выполнения программы Python в скрипте Bash используйте команду вида:
python СКРИПТ.py АРГУМЕНТ1 АРГУМЕНТ2 АРГУМЕНТ3
Пример запуска скрипта extractor.py с передачей ему двух аргументов: значение переменной $line и 8080:
python extractor.py $line 8080
Как в скрипте Bash запустить программу на Python и присвоить её вывод переменной
Если вам нужно запустить скрипт Python, а затем вывод программы присвоить переменной Bash, то используйте конструкцию вида:
ПЕРЕМЕННАЯ=`python СКРИПТ.py АРГУМЕНТ1 АРГУМЕНТ2 АРГУМЕНТ3`
response=`python extractor.py $line 8080 2>/dev/null | sed -E «s///.+:///$line:/»`
Как в скрипт Bash встроить код Python
Если код Python невозможно использовать в одной строке и вы не хотите использовать для вызова внешний скрипт, тогда вам подойдёт следующая конструкция:
#!/bin/bash script=`cat
Там где КОД вставьте код Python.