2010-01-22 14 views
12

Mam funkcję Python, fooPy(), która zwraca pewną wartość. (int/double lub string)przypisywanie wartości do zmiennej powłoki za pomocą funkcji zwracanej wartości z Python

Chcę użyć tej wartości i przypisać ją w skrypcie powłoki. Na przykład następujące jest funkcja python:

def fooPy(): 
    return "some string" 
    #return 10 .. alternatively, it can be an int 

fooPy() 

W skrypcie powłoki wypróbowałem następujące rzeczy, ale żaden z nich nie działa.

fooShell = python fooPy.py 
#fooShell = $(python fooPy.py) 
#fooShell = echo "$(python fooPy.py)" 

Odpowiedz

32

można wydrukować swoją wartość w Pythonie, tak:

print fooPy() 

w skrypcie powłoki:

fooShell=$(python fooPy.py) 

Pamiętaj, aby nie pozostawić miejsca na całym = w powłoce scenariusz.

+1

dziękuję, to działało! Również popełniłem błąd, umieszczając spacje wokół =. Naprawiono to również. – cppb

+0

+1 za wzmiankę "Upewnij się, że nie pozostawisz spacji wokół = w skrypcie powłoki" To denerwuje piekło z nowicjuszami takimi jak ja. –

10

W kodzie Pythona należy wydrukować wynik.

import sys 
def fooPy(): 
    return 10 # or whatever 

if __name__ == '__main__': 
    sys.stdout.write("%s\n", fooPy()) 

Następnie w skorupkach, można zrobić:

fooShell=$(python fooPy.py) # note no space around the '=' 

Zauważ, że dodałem sprawdzenie if __name__ == '__main__' w kodzie Pythona, aby upewnić się, że drukowanie odbywa się tylko wtedy, gdy program jest uruchamiany z w wierszu poleceń, a nie podczas importowania go z interpretera w języku Python.

użyłem również sys.stdout.write() zamiast print, ponieważ

  • print ma różne zachowanie w Pythonie Python 2 i 3,
  • w "rzeczywistych programów", należy użyć sys.stdout.write() zamiast print w każdym razie :-)
+0

+ 1, aby uzyskać szczegółową odpowiedź i uwagi na temat sys.stdout.write() Jest to przydatne. Dziękuję Ci! – cppb

+0

Genialny. Dokładnie to, czego szukałem –

3

Powinieneś uzyskać print wartość zwróconą przez fooPy. Substytucja powłoki czyta ze stdout. Zamień ostatni wiersz programu na print fooPy(), a następnie użyj drugiego potoku powłoki, o którym wspomniałeś. Powinno działać.

5

Jeśli chcesz, aby wartość z instrukcji Python sys.exit, będzie w specjalnej zmiennej powłoki $?.

$ var=$(foo.py) 
$ returnval=$? 
$ echo $var 
Some string 
$ echo returnval 
10 
+0

+1 za wskazanie drogi do uzyskania kodu zakończenia ... ale pozwól mi rozwiązać jeden mały szczegół. – fortran

+0

Dzięki za poprawkę (takie są zagrożenia związane z pracą w wielu językach). –

+0

hmm..to powoduje, że wywołanie "return return_val" jest niepotrzebne (jeszcze nie testowane). Dzięki, to jest przydatne informacje. +1. – cppb

Powiązane problemy