Вызов функции python из подоболочки

#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, но, возможно, и в оболочке), если это возможно, вместо вычисления переменных в одной программе и использования их в другой.