Вызов функции Python из сценария оболочки - PullRequest
14 голосов
/ 20 декабря 2011

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

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

Я делаю это для того, чтобы прочитать файл конфигурации с использованием 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 Ответ

26 голосов
/ 20 декабря 2011

Вы можете отправить результат ваших функций на стандартный вывод, попросив интерпретатор 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).

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

...