bash выполнить скрипт python
Как запустить небольшой код Python в Bash
Bash — это не только и даже не столько встроенные функции оболочки сколько программы (утилиты) командной строки. Запуская эти команды и передавая полученные данные конвейеру (по трубе) можно автоматизировать самые различные вещи, на программирование которых в других языках программирования может понадобиться очень много усилий.
Эта заметка расскажет, как запустить код Python в Bash, а также как в скрипте Bash запустить выполнение программы на Python
Как выполнить код Python в Bash
В командной строке Bash для выполнения кода используйте конструкцию вида:
Ещё один вариант, который может пригодиться в более экзотических обстоятельствах:
Как в скрипте Bash запустить программу на Python
Для выполнения программы Python в скрипте Bash используйте команду вида:
Как в скрипте Bash запустить программу на Python и присвоить её вывод переменной
Если вам нужно запустить скрипт Python, а затем вывод программы присвоить переменной Bash, то используйте конструкцию вида:
Как в скрипт Bash встроить код Python
Если код Python невозможно использовать в одной строке и вы не хотите использовать для вызова внешний скрипт, тогда вам подойдёт следующая конструкция:
Там где КОД вставьте код Python.
Данный пример является рабочим:
Ещё один вариант этой конструкции:
И ещё один вариант, в котором вывод присваивается в качестве значения переменной ABC:
Запуск скрипта питон в скрипте баш
Решил более подробно изложить ситуацию.
Есть баш скрипт который делает всякие вычисления, и определяет переменные, которые затем будут заданы в виде параметров у питон скрипта
При запуске BASH скрипта, не чувствуется работа скрипта
и выполняю, то вывод будет такой:
2 ответа 2
на интерпретатор python, запускаемый из shell-скрипта, эта внутренняя команда оболочки, естественно, не оказывает (да и не может оказать) никакого влияния.
разница же в поведении вашего python-скрипта, возможно, вызвана разными наборами опций и параметров, которые вы передаёте этому скрипту в одном и в другом случае.
сравниваю аргументы двух вызовов (я убрал явно совпадающие):
и тут, вероятно сказывается либо специфика работы программы python (я встречал подобное в некоторых случаях), либо специфика скрипта crowbar.py : скрипт «воспринимает» эти строки не в качестве опций, а в качестве параметров.
возможно, сможет помочь использование встроенной в оболочку команды eval :
обновление
также можно попробовать «разорвать питонов узел». попробуйте вызывать crowbar.py без явного указания интерпретатора.
для этого предварительно файлу надо добавить бит исполнимости:
а затем в bash-скрипте вызывать его по имени:
этот же вызов можно попробовать и «завернуть» в eval :
Запуск python скрипта в Linux
На этом языке написано огромное количество системных программ, среди них пакетный менеджер apt, видеоредактор OpenShot, а также множество скриптов, которые вы можете установить с помощью утилиты pip. В этой небольшой статье мы рассмотрим как запустить Python скрипт в Linux с помощью терминала различными способами.
Запуск python скрипта в Linux
Для примера нам понадобится Python скрипт. Чтобы не брать какой-либо из существующих скриптов, давайте напишем свой:
print(«Hello from losst!»)
Для того чтобы запустить скрипт необходимо передать его интерпретатору Python. Для этого просто откройте терминал с помощью сочетания клавиш Ctrl + Alt + T, перейдите в папку со скриптом и выполните:
Но как вы могли заметить, при запуске apt или openshot не надо писать слово python. Это намного удобнее. Давайте разберемся как это реализовать. Если вы не хотите указывать интерпретатор в командной строке, его надо указать в самом скрипте. Для этого следует в начало скрипта добавить такую строчку:
Сохраните изменения, а затем сделайте файл скрипта исполняемым с помощью такой команды:
chmod ugo+x script.py
После этого можно запустить скрипт Python просто обращаясь к его файлу:
Как видите, запуск команды python Linux выполняется довольно просто и для этого даже есть несколько способов. А каким способом пользуетесь вы? Напишите в комментариях!
Запуск python скрипта с параметрами из bash
Добрейшего дня! Трабл. Есть скрипт ip-up, который отрабатывает при подключении pptp-клиента. Есть скрипт, назову его условно connect, которому передаются параметры от ip-up. Скрипты на bash. Все прекрасно работает. Возникла необходимость переписать bash-скрипт на python3. Скрипт умеет принимать параметры. Проблем тут нет. Проблема возникает когда, я пытаюсь передать параметры от ip-up. То есть connect(bash) принимает параметры, а connect(python) не воспринимает их. Если запускаю вручную в терминале (debian 8):
Тут загвоздочка. Не могу выложить. Не положено. Извините=)
Ну хотя бы часть, отвечающую за эту функциональность, либо сделать кошечные скрипты чтоб на них тренироваться
отрежь все, что секурно, выложи все, что можно. нужно глядеть именно связки запуска
Ну добавь логирования в скрипт, убедись что параметры действительно имеются. Попробуй перекатись на переменные среды.
Ща, господа, сбацаю пару простых скриптов. Для понимания сути просто. Немножко времени дайте.
Абсолютно стандартный скрипт ip-up из /etc/ppp. В него в конце добавлена строка:
вот в таких кавычках?
Делал уже. Не помогло.
И, кстати, у тебя там connectpy вместо connect.py. Не в этом ли проблема?
объясняю. Есть два варианта. Оба работают одинаково. 1. python3 connect.py 2. файл без py. Первой строкой #!/bin/python3
На всякий случай уточню:
Надеюсь все-таки #!/usr/bin/python3
Творятся чудеса. Нащупал нить. Отпишусь по результатам.
Пошел путем от простого к сложному. Один скрипт на bash запускает скрипт на python и передает ему параметры.
Я все-таки склоняюсь, что проблема в кодировке. А можно как-то в режиме отладки запустить скрипт и вывести инфу в файл?
Уже тоже подумал об этом. Буду пробовать варианты. Отпишусь.
А если так сделать:
т.е. скрипт ip-up сейчас оригинальный, без коррективов. Если его запустить в mc руками, то скрипт python из папки ip-up.d срабатывает как надо. Создает файл со строкой внутри.
Я имел в виду, эту строку прописать в баш-скрипт.
что только не пробовал. Уже через вызов внешней программы, которая запускает скрипт и передает ему параметры. Суть такова. Скрипт запущенный в любом месте и любым образом работает. При запуске с использованием ip-up действуют некие ограничения ввода/вывода, которые мешают корректной работе скрипта.
«Имеются следующие ограничения на /etc/ppp/ip-up:
Про полные пути понятно, А вот что конкретно таит в себе преднамеренно ограниченное окружение не совсем понятно. Но ограничения эти накладываются на все запущенные через ip-up скрипты и/или программы. Как я понял ввод/вывод происходит иначе, чем при ручном запуске скриптов. И дело тут нев правах и путях, а именно в самом принципе работы ip-up/down. Есть у кого какие мысли на этот счет? Не хочется переделывать python обратно на bash 🙁
Поэтому и не воспринимает получается мой скрипт на python корректно параметры, которые передает ip-up и запись в файл не происходит.
Блин, ребята, может кто у себя проверить? Может возникнут идеи.
Попробовал набросать скрипт на lua. Получилось принять параметры от ip-up и даже в файл все красиво записалось. Никаких манипуляций не пришлось делать ни с правами, ни с кавычками. Буду переписывать скрипт на lua. Одна проблема, что я в нем пока не шарю. Придется разбираться сразу на практике. Самое время для быдлокода=))
А вот что конкретно таит в себе преднамеренно ограниченное окружение не совсем понятно.
Не устанавливаются переменные окружения? Как их подтянуть в пистоне я хз.
В lua работает как надо. Ковыряюсь с переносом скрипта. Спасибо.
Выполнение shell команд с Python
Повторяющиеся задачи созрели для автоматизации. Разработчики и системные администраторы обычно автоматизируют рутинные задачи, такие как проверки работоспособности и резервное копирование файлов, с помощью сценариев оболочки. Однако, поскольку эти задачи становятся более сложными, сценарии оболочки могут усложняться в обслуживании.
К счастью, мы можем использовать Python вместо сценариев оболочки для автоматизации. Python предоставляет методы для запуска команд оболочки, предоставляя нам ту же функциональность, что и сценарии оболочки. Изучение того, как выполнять команды оболочки в Python, открывает нам возможность автоматизировать компьютерные задачи структурированным и масштабируемым образом.
В этой статье мы рассмотрим различные способы выполнения команд оболочки в Python и идеальную ситуацию для использования каждого метода.
Использование os.system для запуска команды
Давайте начнем с создания нового файла Python с именем echo_adelle.py и введите следующее:
В вашем терминале запустите этот файл с помощью следующей команды, и вы должны увидеть соответствующий вывод:
Давайте создадим новый файл с именем cd_return_codes.py и введите следующее:
В этом сценарии мы создаем две переменные, в которых хранятся результаты выполнения команд, которые изменяют каталог на домашнюю папку и на несуществующую папку. Запустив этот файл, мы увидим:
Выполнение команды с подпроцессом
В новом файле с именем list_subprocess.py напишите следующий код:
Запустите этот файл, и вывод вашей консоли будет похож на:
Мы используем довольно много параметров, давайте рассмотрим их:
Запуск этого файла приводит к следующему выводу:
Мы также можем бросить Exception без проверки значения возврата. В новом файле false_subprocess.py добавьте код ниже:
В вашем терминале запустите этот файл. Вы увидите следующую ошибку:
Выполнение команды с Popen
Класс subprocess.Popen предоставляет больше возможностей для разработчика при взаимодействии с оболочкой. Тем не менее, мы должны быть более точными в получении результатов и ошибок
По умолчанию subprocess.Popen не останавливает обработку программы Python, если ее команда не завершила выполнение. В новом файле с именем list_popen.py введите следующее:
Допустим, мы не хотим ждать завершения выполнения команды оболочки, чтобы программа могла работать над другими вещами. Как узнать, когда команда оболочки закончила выполнение?
В новый файл с именем cat_popen.py добавьте следующий фрагмент кода:
Какой из них я должен использовать?
Вот таблица с некоторыми различиями в юзабилити, которые вы также можете использовать для обоснования своего решения: