- Пишем shell скрипты на Python и можно ли заменить им Bash
- Введение
- Это ж не валидный синтаксис Python получается, как все работает то?
- Давайте же скорее посмотрим на какой-нибудь пример
- Установка
- Запустим же что-нибудь
- Совместимость
- Документация (на английском)
- Можно ли законтрибьютить
- Оно мне ничего в продакшене не разломает?
- Выполнение команд оболочки с Python
- Выполнить команду Shell в Python с модулем os
- Выполнить команду оболочки в Python с модулем подпроцесса
- Executing Shell Commands with Python
- Execute Shell command in Python with os module
- Execute shell command in Python with subprocess module
- Запуск python скрипта в Linux
- Запуск python скрипта в Linux
Пишем shell скрипты на Python и можно ли заменить им Bash
В этой небольшой статье речь пойдет о том, можно ли легко использовать Python для написания скриптов вместо Bash/Sh. Первый вопрос, который возникнет у читателя, пожалуй, а почему, собственно, не использовать Bash/Sh, которые специально были для этого созданы? Созданы они были достаточно давно и, на мой взгляд, имеют достаточно специфичный синтаксис, не сильно похожий на остальные языки, который достаточно сложно запомнить, если вы не администратор 50+ левела. Помните, ли вы навскидку как написать на нем простой if?
Элементарно правда? Интуитивно понятный синтаксис. 🙂
Тем не менее в python эти конструкции намного проще. Каждый раз когда я пишу что то на баше, то непременно лезу в поисковик чтобы вспомнить как писать простой if, switch или что-то еще. Присвоение я уже запомнил. 🙂 В Python все иначе. Я хоть и не пишу на нем круглые сутки, но никогда не приходилось лезть и смотреть как там сделать простой цикл, потому что синтаксис языка простой и интуитивный. Плюс ко всему он намного ближе к остальным мейнстримовым языкам типа java или c++, чем Bash/Sh.
Также в стандартной и прочих библиотеках Python есть намного более удобные библиотеки чем консольные утилиты. Скажем, вы хотите распарсить json, xml, yaml. Знаете какой я недавно видел код в баше чтобы сделать это? Правильно:
И это был не мой код. Это был код баше/питоно нейтрального человека.
То же самое с регексом, sed бесспорно удобная утилита, но как много людей помнит как правильно ее использовать? Ну кроме Lee E. McMahon, который ее создал. Да впринципе многие помнят, даже я помню как делать простые вещи. Но, на мой взгляд, в Python модуль re намного удобнее.
В этой небольшой статье я хотел бы представить вам диалект Python который называется shellpy и служит для того, чтобы насколько это возможно заменить Bash на python в скриптах.
Введение
Shell python ничем не отличается от простого Python кроме одной детали. Выражения внутри grave accent символов ( ` ) в отличие от Python не является eval, а обозначает выполнение команды в шелле. Например
выполнит ls -l как shell команду. Также возможно написать все это без ` в конце строки
и это тоже будет корректным синтаксисом.
Можно выполнять сразу несколько команд на разных строках
и команды, занимающие несколько строк
Выполнение каждого выражения в shellpy возвращается объект класса Result
Это можно быть либо Result либо InteractiveResult (Ссылки на гитхаб с документацией, можно и потом посмотреть 🙂 ). Давайте начнем с простого результата. Из него можно легко получить код возврата выполненной команды
И текст из stdout и stderr
Можно также пробежаться по всем строкам stdout выполненной команды в цикле
Для результата есть также еще очень много синтаксического сахара. Например, мы можем легко проверить, что код возврата выполняемой команды равен нулю
Или же более простым способом получить текст из stdout
Все вышеперечисленное — это обзор синтаксиса вкратце, чтобы просто понять основную идею и не грузить вас всеми-всеми деталями. Там есть еще много чего и для интерактивного взаимодействия с выполняемыми командами, для управления исполнением команд. Но это все детали, в которые можно окунуться в документации (на английском языке), если сама идея вам покажется интересной.
Это ж не валидный синтаксис Python получается, как все работает то?
Магия конечно, как еще 🙂 Да, друзья мои, мне пришлось использовать препроцессинг, каюсь, но другого способа я не нашел. Я видел другие библиотеки, которые делают нечто подобное, не нарушая синтаксиса языка вроде
Но меня такой синтаксис не устраивал, поскольку даже несмотря на сложности, хотелось получить best user experience ©, а для меня это значит насколько это возможно простое и близкое к его величеству Шеллу написание команд.
Знакомый с темой читатель спросит, чем IPython то тебя не устроил, там ж почти как у тебя только значок другой ставить надо, может ты просто велосипедист, которому лень заглянуть в поисковик? И правда он выглядит вот так:
Я его пытался использовать но встретил пару серьезных проблем, с которыми ужиться не смог. Самая главная из них, то что нет простого импорта как в Python. То есть ты не можешь написать какой-то код на самом ipython и легко его переиспользовать в других местах. Невозможно написать для своего ipython модуля
и чтобы все сразу заработало как в сказке. Единственный способ переиспользовать скрипт, это выполнить его. После выполнения в окружении у тебя появляются все функции и переменные, объявленные в выполняемом файле. Не кошерно на мой взгляд.
В shellpy код переиспользуется легко и импортируется точно так же как и в обычном python. Предположим у нас есть модуль common в котором мы храним очень полезный код. Заглянем в директорию с этим модулем
Итак, что у нас тут есть, ну во первых init, но с расширением .spy. Это и является отличительной чертой spy модуля от обычного. Посмотрим также внутрь файла common.spy, что там интересного
Мы видим что тут объявлена функция, которая внутри себя использует shellpy синтаксис чтобы вернуть результат выполнения `echo 5. Как этот модуль используется в коде? А вот как
Видите? Как в обычном Python, просто взяли и заимпортировали.
Как же все работает. Это работает с помощью PEP 0302 — New Import Hooks. Когда вы импортируете что-то в своем коде то вначале Python спрашивает у хука, нет ли тут чего-то твоего, хук просматривает PYTHONPATH на наличие файлов *.spy или модулей shellpython. Если ничего нет, то так и говорит: «Ничего нету, импортируй сам». Если же он находит что-то там, то хук занимается импортом самостоятельно. А именно, он делает препроцессинг файла в обычный python и складывает все это добро в temp директорию операционной системы. Записав новый Python файл или модуль он добавляет его в PYTHONPATH и за дело берется уже самый обыкновенный импорт.
Давайте же скорее посмотрим на какой-нибудь пример
Этот скрипт скачивает аватар юзера Python с Github и кладет его в temp директорию
Установка
Shellpython можно установить двумя способами: pip install shellpy или склонировав репозиторий и выполнив setup.py install . После этого у вас появится утилита shellpy .
Запустим же что-нибудь
После установки можно потестировать shellpython на примерах, которые доступны прямо в репозитории.
Также здесь есть allinone примеры, которые называются так, потому что тестируют все-все функции, которые есть в shellpy. Загляните туда, чтобы лучше узнать что же там еще такого есть, либо просто выполните
Для третьего Python команда выглядит вот так
Совместимость
Это работает на Linux и должно работать на Mac для Python 2.x и 3.x. На виндовсе пока не работает, но проблем никаких для работы нет, так как все писалось с использованием кроссплатформенных библиотек и ничего платформоспецифичного в коде нет. Просто не дошли руки еще, чтобы потестировать на виндовсе. Мака у меня тоже нет, но вроде у друга работало 🙂 Если у вас есть мак и у вас все нормально, скажите пожалуйста.
Если найдете проблемы — пишите в коммент, либо сюда либо телеграфируйте как-нибудь 🙂
Документация (на английском)
Можно ли законтрибьютить
Оно мне ничего в продакшене не разломает?
Сейчас версия 0.4.0, это не стейбл и продакшн процессы пока лучше не завязывать на скрипт, подождав пока все отладится. Но в девелопменте, CI можно использовать вполне. Все это покрыто тестами и работает 🙂
Источник
Выполнение команд оболочки с Python
Поскольку в задачи системный администратор все время включает команды Linux, выполнение команд Linux из скрипта Python является отличной помощью.
В этой статье мы покажем вам пару способов, которыми вы можете запускать команды оболочки и получать их вывод в своей программе Python.
Выполнить команду Shell в Python с модулем os
Позвольте нам создать простую программу на Python, которая выполняет команду оболочки с модулем os.
Теперь, если мы запускаем эту программу, и вот что мы видим в выводе.
Это содержимое каталога, в котором хранится myprog.py.
Если вы хотите использовать вывод команды оболочки, вы можете сохранить его в файле непосредственно из команды оболочки:
Вы также можете сохранить выходные данные команды оболочки в переменной следующим образом:
Если вы запустите вышеупомянутую программу, она напечатает содержимое переменной myCmd и будет такой же, как и результат команды ls, которую мы видели ранее.
Теперь давайте посмотрим другой способ запуска команды Linux в Python.
Выполнить команду оболочки в Python с модулем подпроцесса
Несколько лучший способ запуска команд оболочки в Python – использование подпроцессмодуль.
Если вы хотите запустить команду оболочки без каких-либо параметров и аргументов, вы можете вызвать подпроцесс следующим образом:
Метод call выполнит команду оболочки. Вы увидите содержимое текущего рабочего каталога при запуске программы:
Если вы хотите предоставить опции и аргументы вместе с командой оболочки, вам придется предоставить их в виде списка.
Когда вы запустите программу, вы увидите содержимое текущего каталога в виде списка.
Теперь, когда вы знаете, как запустить команду оболочки с подпроцессом, возникает вопрос о сохранении вывода команды оболочки.
Для этого вам нужно будет использовать функцию Popen. Он выводит объект Popen, у которого есть метод communication(), который можно использовать для получения стандартного вывода и ошибки в виде кортежа.
Когда вы запустите программу, вы увидите stdout и stderr (которых в данном случае нет).
Мы надеемся, что этот быстрый совет помог вам выполнить команду оболочки в программах Python. Если у вас есть вопросы или предложения, пожалуйста, не стесняйтесь оставить комментарий ниже.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Источник
Executing Shell Commands with Python
Python is an excellent scripting language. More and more sysadmins are using Python scripts to automate their work.
Since the sysadmin tasks involve Linux commands all the time, running Linux commands from the Python script is a great help.
In this tutorial, I’ll show you a couple of ways you can run shell commands and get its output in your Python program.
Execute Shell command in Python with os module
Let me create a simple python program that executes a shell command with the os module.
Now, if I run this program, here’s what I see in the output.
That’s the content of the directory where prog.py is stored.
If you want to use the output of the shell command, you can store it in a file directly from the shell command:
You can also store the output of the shell command in a variable in this way:
If you run the above program, it will print the content of the variable myCmd and it will be the same as the output of the ls command we saw earlier.
Now let’s see another way of running Linux command in Python.
Execute shell command in Python with subprocess module
A slightly better way of running shell commands in Python is using the subprocess module.
If you want to run a shell command without any options and arguments, you can call subprocess like this:
The call method will execute the shell command. You’ll see the content of the current working directory when you run the program:
If you want to provide the options and the arguments along with the shell command, you’ll have to provide them in a list.
When you run the program, you’ll see the content of the current directory in the list format.
Now that you know how to run shell command with subprocess, the question arises about storing the output of the shell command.
For this, you’ll have to use the Popen function. It outputs to the Popen object which has a communicate() method that can be used to get the standard output and error as a tuple. You can learn more about the subprocess module here.
When you run the program, you’ll see the stdout and stderr (which is none in this case).
I hope this quick tip helped you to execute shell command in Python programs. In a related quick tip, you can learn to write list to file in Python.
If you have questions or suggestions, please feel free to drop a comment below.
Источник
Запуск python скрипта в Linux
Python — очень популярный язык программирования для написания различных системных скриптов в Linux. В Windows, там где не хватает возможностей командной оболочки используется PowerShell. В Linux же, когда возможностей Bash не хватает используется язык Python.
На этом языке написано огромное количество системных программ, среди них пакетный менеджер apt, видеоредактор OpenShot, а также множество скриптов, которые вы можете установить с помощью утилиты pip. В этой небольшой статье мы рассмотрим как запустить Python скрипт в Linux с помощью терминала различными способами.
Запуск python скрипта в Linux
Для примера нам понадобится Python скрипт. Чтобы не брать какой-либо из существующих скриптов, давайте напишем свой:
print(«Hello from losst!»)
Для того чтобы запустить скрипт необходимо передать его интерпретатору Python. Для этого просто откройте терминал с помощью сочетания клавиш Ctrl + Alt + T, перейдите в папку со скриптом и выполните:
Если вы хотите, чтобы после выполнения скрипта открылась консоль, в которой можно интерактивно выполнять команды языка Python используйте опцию -i:
python -i script.py
Но как вы могли заметить, при запуске apt или openshot не надо писать слово python. Это намного удобнее. Давайте разберемся как это реализовать. Если вы не хотите указывать интерпретатор в командной строке, его надо указать в самом скрипте. Для этого следует в начало скрипта добавить такую строчку:
Сохраните изменения, а затем сделайте файл скрипта исполняемым с помощью такой команды:
chmod ugo+x script.py
После этого можно запустить скрипт Python просто обращаясь к его файлу:
Если убрать расширение .py и переместить скрипт в каталог, находящийся в переменной PATH, например /usr/bin/, то его можно будет выполнять вот так:
Как видите, запуск команды python Linux выполняется довольно просто и для этого даже есть несколько способов. А каким способом пользуетесь вы? Напишите в комментариях!
Источник