2011-12-19 13 views
11

Próbuję dowiedzieć się, jak wywołać funkcję Python ze skryptu powłoki.Wywołanie funkcji Pythona ze skryptu powłoki

Mam plik Pythona z wieloma funkcjami i muszę użyć wartości zwracanych przez nich w moim skrypcie powłoki. Czy jest sposób, aby to zrobić?

Robię to, aby odczytać plik konfiguracyjny za pomocą Pythona i uzyskać wartości w powłoce. Czy jest jakiś inny lepszy sposób, aby to osiągnąć.

test.py zawiera:

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

muszę przechowywać wartości zwracanych przez funkcje Pythona w zmiennej powłoki.

+3

Jaki jest większy problem, który próbujesz rozwiązać? Dlaczego nie użyć skryptu z konfiguracją do działania skryptu powłoki? Alternatywnie, dlaczego nie przeczytać config z powłoki? Zakładam, że problem jest na tyle złożony, że dzieli go na dwa pliki. –

Odpowiedz

22

Możesz wysłać wynik swoich funkcji na standardowe wyjście prosząc interpreter Pythona wydrukować wynik:

python -c 'import test; print test.get_foo()' 

Opcja -c prostu pyta Python wykonać kilka poleceń Pythona.

Aby zapisać wynik w zmiennej, można zatem zrobić:

RESULT_FOO=`python -c 'import test; print test.get_foo()'` 

lub równoważnie

RESULT=$(python -c 'import test; print test.get_foo()') 

od backticks i $(…) ocenić polecenia i zastąpienie go przez jego wyjściu.

PS: Uzyskanie wyniku każdej funkcji wymaga przeanalizowania pliku konfiguracyjnego za każdym razem, przy użyciu tego podejścia. To może być zoptymalizowane poprzez zwrot wszystkich wyników w jednym zamachem, z czymś takim:

ALL_RESULTS=$(python -c 'import test; print test.get_foo(), test.get_bar()') 

Wyniki można następnie podzielić i umieścić w różnych zmiennych z

RESULT_BAR=$(echo $ALL_RESULTS | cut -d' ' -f2) 

która podejmuje drugą wynik i umieszcza go na przykład w RESULT_BAR (i podobnie: -fn dla wyniku #n).

PPS: Jak wspomniano Pablo Maurin, prawdopodobnie byłoby łatwiej zrobić wszystko w jednym tłumacza (Python, ale może również shell), jeśli to możliwe, zamiast obliczania zmiennych w jednym programie i korzystania z nich w inny jeden.

+0

lub spróbuj wysłać wynik do innego skryptu Pythona i uruchom go. – sum2000

+0

wygląda ładnie ... działało ... zastanawiałem się. w tym przypadku ... aby odczytać n parametru z pliku konfiguracyjnego, muszę wywołać n razy powyższą linię z powłoki, która skończy się czytaniem tyle razy w pythonie za pomocą configparser. Czy jest jakiś inny lepszy sposób, jaki mogłem zrobić? –

+1

@saddy: Możesz na przykład wydrukować oba wyniki razem, a następnie użyć narzędzi Unix do podzielenia ich: 'RESULT = $ (test importu, print test.get_foo(), test.get_bar())', a następnie użyj 'cut ',' sed' (?) lub 'awk' (?), aby wyodrębnić każdą część wyniku po kolei: 'RESULT2 = $ (echo $ WYNIK | cut-d '' -f 2)' daje twój 'get_bar()', itp. – EOL

Powiązane problemy