Вызов функции Python из оболочки script

Я пытаюсь выяснить, как вызвать функцию Python из оболочки script.

У меня есть файл Python с несколькими функциями, и мне нужно использовать значения, возвращаемые ими в моей оболочке script. Есть ли способ сделать это.

Я делаю это, чтобы прочитать файл конфигурации с помощью Python и получить значения в оболочке. Есть ли другой лучший способ достичь этого.

test.py содержит:

import ConfigParser

config = ConfigParser.ConfigParser()
config.read("test.conf")

def get_foo():
    return config.get("locations", "foo")

def get_bar():
    return config.get("locations", "bar")

Мне нужно сохранить значения, возвращаемые функциями Python в переменной оболочки.

Ответ 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()')

так как backticks и $(…) оценивают команду и заменяют ее ее выходом.

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).

PPS. Как упоминал Пабло Маурин, вероятно, было бы проще сделать все в одном интерпретаторе (Python, но, возможно, и в оболочке), если это возможно, вместо вычисления переменных в одной программе и используя их в другом.