#python #bash #shell #scripting
Вопрос:
Я пишу программу на python, которая запускает некоторые сценарии BASH в подпроцессах. Можно сказать, что я использую BASH в качестве языка сценариев для своей программы на python.
Есть ли способ внедрить функции python в мой скрипт bash без необходимости перезагрузки кода python из bash?
пример стромана: Если бы это был Python, работающий на Javascript, я мог бы привязать свои функции Python к виртуальной машине js2py и вызывать их из javascript.
Я подумал о вызове: python some_file_of_mine.py
из bash , но это означало бы запуск нового процесса python без доступа к данным моей программы на python.
Также подумывал позвонить: python -c $SOME_INJECTED_PYTHON_CODE
. Это может использовать функцию inspect.source() Python для предварительного ввода некоторого простого кода python вместе с некоторыми связанными данными из родительского процесса в дочернюю оболочку bash. Однако это будет очень чувствительно к кавычкам(`/») и вызовет некоторые проблемы с импортом$.
Что мне действительно хотелось бы, так это простой способ вызова родительского процесса подпроцессом bash и получения некоторых данных обратно (за исключением использования комбинации Flask CURL).
Комментарии:
1. Я не понимаю твоей проблемы. Возможно, вам следует запустить все в одном скрипте Python и пропустить весь код bash. Или, может быть, вам следует записать данные в файл и прочитать их в другом сценарии. Или отправить в качестве параметра
python script.py arg1 arg2 ...
2. Вы можете использовать файл fifo для связи или попросить процесс Python создать пару fd для чтения/записи. Но почему бы не использовать Python для написания сценариев на Python..?
3. @AKX файловые дескрипторы кажутся хорошей идеей. Я попробую это сделать
4. Это похоже на пример проблемы XY .
Ответ №1:
Вы можете отправить результат своих функций в стандартный вывод, попросив интерпретатор Python распечатать результат:
python -c 'import test; print test.get_foo()'
-c
Опция просто просит Python выполнить некоторые команды Python.
Поэтому для того, чтобы сохранить результат в переменной, вы можете сделать:
RESULT_FOO=`python -c 'import test; print test.get_foo()'`
или, что эквивалентно
RESULT=$(python -c 'import test; print test.get_foo()')
так как отступает и $(…)
оценивает команду и заменяет ее ее выводом.
PS: При таком подходе для получения результата каждой функции требуется каждый раз анализировать файл конфигурации. Это можно оптимизировать, вернув все результаты за один раз, с помощью чего-то вроде:
ALL_RESULTS=$(python -c 'import test; print test.get_foo(), test.get_bar()')
Затем результаты можно разделить и поместить в разные переменные с
RESULT_BAR=$(echo $ALL_RESULTS | cut -d' ' -f2)
который берет второй результат и помещает его, RESULT_BAR
например (и аналогично: -fn
для результата #n).
PS2: вероятно, было бы проще делать все в одном интерпретаторе (Python, но, возможно, и в оболочке), если это возможно, вместо вычисления переменных в одной программе и использования их в другой.