- Выполнение shell команд с Python
- Использование os.system для запуска команды
- Выполнение команды с подпроцессом
- Выполнение команды с Popen
- Какой из них я должен использовать?
- Как запустить скрипт на Python
- Интерпретатор и его установка
- Интерактивный запуск кода Python
- Примеры работы в интерактивном сеансе
- Запуск скрипта Python через командную строку
- Команда «python» и запуск по имени
- Запуск модуля
- Перенаправление вывода
- Использование IDLE
- Запуск скрипта
- Запуск скрипта из интерактивного режима
- import
- Запуск скриптов из текстового редактора или IDE
- Запуск скриптов через менеджер файлов
Выполнение shell команд с Python
Повторяющиеся задачи созрели для автоматизации. Разработчики и системные администраторы обычно автоматизируют рутинные задачи, такие как проверки работоспособности и резервное копирование файлов, с помощью сценариев оболочки. Однако, поскольку эти задачи становятся более сложными, сценарии оболочки могут усложняться в обслуживании.
К счастью, мы можем использовать Python вместо сценариев оболочки для автоматизации. Python предоставляет методы для запуска команд оболочки, предоставляя нам ту же функциональность, что и сценарии оболочки. Изучение того, как выполнять команды оболочки в Python, открывает нам возможность автоматизировать компьютерные задачи структурированным и масштабируемым образом.
В этой статье мы рассмотрим различные способы выполнения команд оболочки в Python и идеальную ситуацию для использования каждого метода.
Использование os.system для запуска команды
Python позволяет нам немедленно выполнить команду оболочки, которая хранится в строке, используя функцию os.system() .
Давайте начнем с создания нового файла Python с именем echo_adelle.py и введите следующее:
Первое, что мы делаем в нашем Python файле, это импортируем модуль os , который содержит функцию system , которая может выполнять команды оболочки. Следующая строка делает именно это, запускает команду echo в нашей оболочке через Python.
В вашем терминале запустите этот файл с помощью следующей команды, и вы должны увидеть соответствующий вывод:
По мере того, как команды echo выводятся в наш stdout , os.system() также возвращает код завершения команды оболочки. Код 0 означает, что он работает без проблем, а любое другое число означает ошибку.
Давайте создадим новый файл с именем cd_return_codes.py и введите следующее:
В этом сценарии мы создаем две переменные, в которых хранятся результаты выполнения команд, которые изменяют каталог на домашнюю папку и на несуществующую папку. Запустив этот файл, мы увидим:
Первая команда, которая изменяет каталог на домашний каталог, выполняется успешно. Следовательно, os.system() возвращает код ноль, который хранится в home_dir . С другой стороны, unknown_dir сохраняет код завершения неудачной команды bash, чтобы изменить каталог на несуществующую папку.
Функция os.system() выполняет команду, печатает любой вывод команды на консоль и возвращает код завершения команды. Если нам нужно более детальное управление вводом и выводом команды оболочки в Python, мы должны использовать модуль subprocess .
Выполнение команды с подпроцессом
Модуль subprocess — это рекомендуемый Python способ выполнения команд оболочки. Это дает нам гибкость для подавления вывода команд оболочки или цепочки входов и выходов различных команд вместе, в то же время обеспечивая аналогичный опыт os.system() для базовых сценариев использования.
В новом файле с именем list_subprocess.py напишите следующий код:
В первой строке мы импортируем модуль 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 измените:
Стандартный вывод команды теперь передается на специальное устройство /dev/null , что означает, что вывод не будет отображаться на наших консолях. Запустите файл в вашей оболочке, чтобы увидеть следующий вывод:
Что если мы хотим получить результат команды? subprocess.run() поможет сделать это. Создайте новый файл с именем cat_subprocess.py , набрав следующее:
Мы используем довольно много параметров, давайте рассмотрим их:
- stdout=subprocess.PIPE говорит Python перенаправить результат выполнения команды в объект, чтобы позже его можно было прочитать вручную
- text=True возвращает stdout и в stderr виде строк. Тип возвращаемого значения по умолчанию — байты.
- input=»Hello from the other side» говорит Python добавить строку в качестве ввода в команду cat .
Запуск этого файла приводит к следующему выводу:
Мы также можем бросить Exception без проверки значения возврата. В новом файле false_subprocess.py добавьте код ниже:
В вашем терминале запустите этот файл. Вы увидите следующую ошибку:
Используя check=True , мы сообщаем Python, что нужно вызывать любые исключения, если возникает ошибка. Так как мы столкнулись с ошибкой, оператор print в последней строке не был выполнен.
Функция subprocess.run() дает нам огромную гибкость. Эта функция представляет собой упрощенную абстракцию класса subprocess.Popen , которая предоставляет дополнительные функциональные возможности, которые мы можем исследовать.
Выполнение команды с Popen
Класс subprocess.Popen предоставляет больше возможностей для разработчика при взаимодействии с оболочкой. Тем не менее, мы должны быть более точными в получении результатов и ошибок
По умолчанию subprocess.Popen не останавливает обработку программы Python, если ее команда не завершила выполнение. В новом файле с именем list_popen.py введите следующее:
Этот код эквивалентен list_subprocess.py . Он запускает команду с помощью subprocess.Popen и ожидает ее завершения, прежде чем выполнить оставшуюся часть сценария Python.
Допустим, мы не хотим ждать завершения выполнения команды оболочки, чтобы программа могла работать над другими вещами. Как узнать, когда команда оболочки закончила выполнение?
Метод poll() возвращает код завершения, если команда закончит работу, или None если он все еще выполняется. Например, если бы мы хотели проверить, завершено ли list_dir , а не ждать его, у нас была бы следующая строка кода:
Для управления вводом и выводом subprocess.Popen нам нужно использовать метод communicate() .
В новый файл с именем cat_popen.py добавьте следующий фрагмент кода:
Метод communicate() принимает аргумент input , который используется для передачи входных данных команде оболочки. Метод communicate также возвращает stdout и stderr когда они установлены.
Мы рассмотрели три способа запуска команд оболочки в Python с использованием класса subprocess.Popen . Давайте еще раз рассмотрим их характеристики, чтобы узнать, какой метод лучше всего подходит для требований проекта.
Какой из них я должен использовать?
Если вам нужно выполнить одну или несколько простых команд и вам не помешает, если их вывод поступит в консоль, вы можете использовать команду os.system() . Если вы хотите управлять вводом и выводом команды оболочки, используйте subsystem.run() . Если вы хотите выполнить команду и продолжить выполнять другую работу, пока она выполняется, используйте subprocess.Popen .
Вот таблица с некоторыми различиями в юзабилити, которые вы также можете использовать для обоснования своего решения:
Источник
Как запустить скрипт на Python
Каждый разработчик на Python должен знать, как запускать скрипты, потому что это единственный способ проверить работоспособность написанного кода. Чтобы запустить скрипт, программист может использовать:
- Командную строку (терминал).
- Интерактивный режим Python.
- Текстовый редактор или полноценную IDE.
- Менеджер файлов операционной системы (запуск через графический интерфейс).
Каждый способ имеет свои особенности, поэтому его выбор зависит не только от предпочтений или привычек, но и от того, в какой степени программист хочет контролировать параметры запуска скрипта.
Интерпретатор и его установка
Интерпретатор — это программное обеспечение, которое позволяет запускать скрипты Python. С технической точки зрения интерпретатор является связующим слоем между кодом на Python и машинным кодом.
Интерпретатор используется каждый раз, когда программист запускает код: в интерактивном режиме, через командную строку, всегда.
Если же у вас старая версия Windows и предыдущий вариант не работает, то надо зайти на официальный сайт Python, скачать и запустить установочный файл и следовать инструкциям по установке. Не забудьте при установке выставить галку, чтобы Python был добавлен в Windows PATH.
В Linux обычно ничего устанавливать не требуется, так как Pyton включают в его дистрибутив.
Интерактивный запуск кода Python
Для работы с маленькими кусками кода программисты часто используют режим интерактивного сеанса. В этом режиме введенный код на Python сразу интерпретируется и исполняется. То есть не нужно создавать файл и запускать его.
Чтобы войти в интерактивный режим в Windows, можно использовать один из нескольких способов:
- Из меню пуск запустите командную строку «cmd». Затем выполните в ней команду «python». После этого должная отобразиться версия интерпретатора, дата, время и другая информация. Также должны появится несколько символов «>», которые показывают, что можно вводить команды.
- Нажмите сочетание клавиш + , откроется окно «Выполнить». Введите «python». Должна открыться командная строка с запущенным интерактивным сеансом. В ней также должна быть отображена информация о версии, дате и времени, а также символы «>».
- Возможность работы в интерактивном сеансе также встроена в IDLE. Её можно запустить из меню пуск, набрав в поиске «IDLE» и кликнув по найденному значку. После этого сразу откроется интерактивный сеанс. Преимуществом использования IDLE является подсветка синтаксиса.
Чтобы запустить интерактивный сеанс в Linux, необходимо выполнить в терминале команду «python3» или «python2».
Для выхода из интерактивного режима используются комбинации клавиш: + и после этого нажмите . Или можно просто прописать в командной строке quit() или exit().
Примеры работы в интерактивном сеансе
Интерактивный сеанс является необходимым и важным инструментом. С его помощью программист может быстро проверить код, в работе которого он не уверен.
Код исполняется сразу после ввода, однако это не значит, что в терминале можно использовать только однострочные операции, например:
В командной строке также можно писать функции, циклы, условия. Кроме того, в интерактивном сеансе можно импортировать модули.
Командная строка автоматически определяет, когда нужно написать многострочную инструкцию, например, если программист хочет объявить функцию, он пишет:
«>>>» — это просто отображаемый в командной строке символ, свидетельствующий о возможности ввода. Многоточие показывает, что ввод не закончен, тем самым разрешая программисту писать сложные конструкции в несколько строк.
Следующая команда вызывает только что созданную функцию:
Индикаторы ввода остались на этой же строке, потому что мы установили разделитесь функции print с помощью аргумента end = » » .
Запуск скрипта Python через командную строку
Интерактивный сеанс позволяет тестировать код, но как только он завершится, весь код потеряется.
Поэтому большая часть кода пишется с использованием текстовых файлов, которые имеют расширение «.py». Они могут быть созданы с помощью любого текстового редактора, подойдет даже обычный блокнот.
Предположим, что наш скрипт выводит на экран надпись «Hello World!», то есть код будет следующим:
Запишем его в файл world.py. Запустить его через командную строку можно несколькими способами.
Команда «python» и запуск по имени
Самый простой и практичный запуск скриптов — использовать команду «python». Нужно открыть командную строку и написать «python имя_скрипта». Важно, чтобы скрипт находился либо в директории, из которой запущена командная строка, либо в каталоге, прописанном в переменной среды PATH. Тогда запуск пройдет успешно:
Если на компьютере установлены две версии Python, (а на Linux обычно так и есть) следует использовать команды «python3» и «python2» для вызова соответствующей версии.
В последних версиях Windows можно запустить скрипт Python просто введя его имя:
В этом случае запустится новая консоль, выведется в неё сообщение и закроется. Мы ничего не успеем увидеть. Чтобы этого не было, можно в конец файла добавить input(), чтобы скрипт ожидал ввода пользователя.
Такой запуск возможен благодаря тому, что Windows автоматически определяет, какую программу (в данном случае интерпретатор Python) использовать для запуска файла.
В Linux также можно воспользоваться этим способом, но в начале скрипта Python в первой строке должен быть указан полный путь к интерпретатору:
После этого нужно разрешить запуск файла (сделать его исполняемым).
Теперь достаточно просто запустить скрипт, введя в терминал его имя, перед которым добавить «./»:
Запуск модуля
Иногда возникает необходимость запустить модуль, как скрипт. Однако при использовании обычного способа командная строка выдает предупреждение о том, что файл нельзя открыть.
Чтобы запустить модуль, как исполняемый файл, нужно воспользоваться командой:
Перенаправление вывода
Если результаты выполнения скрипта нужно где-то сохранить, чтобы использовать их в последующих операциях, программист может перенаправить вывод из консоли в, например, файл. Для этого используется оператор «>». Вернём содержимое нашего файла world.py в изначальный вариант:
Теперь запустим. Полная команда выглядит так:
Здесь output.txt – это текстовый файл, в который записывается результат выполнения скрипта.
Операция может использоваться как в операционной системе Windows, так и в Unix-подобных системах. Если файла, в который должен вывестись результат, не существует, система создаст его автоматически.
При использовании оператора «>» содержимое файла, в который выводятся данные, полностью перезаписывается. Если уже имеющиеся данные нужно сохранить, используют оператор «>>».
Например, у нас уже есть файл output.txt со строкой приветствия (после того как мы его создали предыдущей командой). Теперь допишем в него ещё одну строку:
Таким образом можно последовательно запустить несколько раз этот скрипт и в файл будут дописываться всё новые строки приветствия.
Использование IDLE
IDLE – это официальная интегрированная среда разработки, поставляемая вместе с интерпретатором Python.
Она позволяет работать в интерактивном режиме, писать и запускать скрипты. Кроме того, IDLE поддерживает подсветку синтаксиса и отладку.
Работа в интерактивном режиме не отличается от того, что было описано для командной строки Windows и терминала Linux. Программист пишет код, который сразу исполняется интерпретатором.
Запуск скрипта
Чтобы запустить скрипт в IDLE, сначала нужно открыть его с помощью «File – Open» или с помощью клавиш + . Затем его необходимо запустить с помощью «Run – Run Module» или с помощью клавиши .
При запуске скрипта можно указать пользовательский параметры, для этого используйте «Run – Run… Customized» или комбинация клавиш + . В поле «Command Line Arguments for sys.argv» прописываются нужные аргументы.
Запуск скрипта из интерактивного режима
Иногда при работе в интерактивном режиме возникает необходимость проверить код какого-либо скрипта. Не обязательно использовать терминал или отдельно открывать скрипт в IDLE, его можно запустить прямо из интерактивного сеанса различными способами.
import
При импорте модуля в скрипт выполняется весь содержащийся в нём код. Если модуль содержит только объявления функций и классов и присвоение значений, программист ничего не увидит. Но если модуль выводит что-то на экран, работает с файлами, то это отобразится при импорте.
Таким образом можно импортировать модуль в интерактивном режиме, чтобы увидеть результаты его выполнения, однако сделать это можно только один раз, потому что при последующих импортах в пределах одного сеанса ничего не произойдет, так как при каждом новом импорте интерпретатор обращается к модулю, записанному в кэш, а не к реальному файлу.
Здесь импортировал библиотеку sys для того чтобы в пути прописать полный путь до моего модуля. Видно, что приветствие отображается только после первой попытки импорта моего модуля.
Оператор exec() сначала читает содержимое модуля, затем отправляет его в функцию, которая выполняет код.
Синтаксис выглядит так:
Запуск скриптов из текстового редактора или IDE
Если программист работает над крупным проектом, ему не достаточно стандартной IDLE и блокнота. В этом случае используется либо текстовый редактор, либо полноценная среда разработки IDE.
Для большинства текстовых редакторов разработаны плагины, позволяющие запускать скрипты Python одним кликом мыши. Сейчас очень популярен текстовый редактор VS Code. Вот здесь можно описано как с ним работать.
Большинство IDE поддерживают запуск скриптов по умолчанию. Обычно это делается с помощью встроенной в панель инструментов кнопки «Запуск/отладка». Эту функцию поддерживают такие IDE, как Eclipse, PyCharm, Eric, NetBeans и другие.
Запуск скриптов через менеджер файлов
В любой операционной системе с графическим интерфейсом можно запустить скрипт Python двойным кликом по файлу. Однако здесь есть свои нюансы, во-первых, система должна связывать расширение «.py» с интерпретатором Python, во-вторых, такой способ ограничивает программиста, не позволяя указать дополнительные параметры.
Этот способ можно использовать не только в Windows, но и Unix-подобных системах. Однако после запуска окно консоли будет сразу закрываться. Чтобы решить эту проблему, в конце скрипта добавляется оператор input(), таким образом консоль не закроется, пока не получит ввод от пользователя.
Ещё одной проблемой является невозможность обнаружения и отладки ошибок. Даже если программист добавил оператор input(), при возникновении ошибки в процессе выполнения скрипта консоль закроется.
Это самый ненадёжный способ, который накладывает на программиста много ограничений. Лучше отказаться от идеи пользоваться файловым менеджером во время отладки скриптов и вернуться к стандартным способам запуска через командную строку.
Источник