2011-07-16 26 views
11

Jaki jest najlepszy sposób przekazywania zmiennych bash do skryptu Pythona. Chciałbym zrobić coś jak następuje:Przekazywanie zmiennych bash do skryptu?

$cat test.sh 
#!/bin/bash 

foo="hi" 
python -c 'import test; test.printfoo($foo)' 

$cat test.py 
#!/bin/python 

def printfoo(str): 
    print str 

Przy próbie uruchomienia skryptu bash, pojawia się błąd składni:

File "<string>", line 1 
    import test; test.printfoo($foo) 
          ^
SyntaxError: invalid syntax 

Odpowiedz

8

w skrócie, to działa:

... 
python -c "import test; test.printfoo('$foo')" 
... 

Aktualizacja:

Jeśli uważasz, że łańcuch może zawierać pojedyncze cytaty ('), jak powiedział @Gordon w komentarzu poniżej, Możesz łatwo uniknąć tych pojedynczych cytatów w bash. Oto alternatywne rozwiązanie w tym przypadku:

... 
python -c "import test; test.printfoo('"${foo//\'/\\\'}"');" 
... 
+2

To nie zadziała interesująco, jeśli $ foo zawiera pojedyncze cudzysłowy lub inne znaki, które python interpretuje wewnątrz literałów. @ Adam's solution jest bardziej solidny ... –

2

trzeba użyć cudzysłowia dostać podstawienia zmiennej w grzmotnąć. Podobne do PHP.

$ foo=bar 
$ echo $foo 
bar 
$ echo "$foo" 
bar 
$ echo '$foo' 
$foo 

Zatem, to powinno działać:

python -c "import test; test.printfoo($foo)" 
+0

To się pogłębia, ale teraz pojawia się błąd po stronie Pythona, gdzie mówi NameError: nazwa "hi" nie jest zdefiniowana. – Ravi

2

Zrób to z obchodzenia argv. W ten sposób nie trzeba go importować, a następnie uruchomić z poziomu tłumacza.

test.py

import sys 

def printfoo(string): 
    print string 

if __name__ in '__main__': 
    printfoo(sys.argv[1]) 

python test.py testingout 
+0

Miałem nadzieję wywołać printfoo bezpośrednio, ponieważ mam wiele innych funkcji Pythona, które pobierają argumenty, które muszą być wywołane z bash. Jeśli przejdę przez główne dla nich wszystkich, będzie to bardziej skomplikowane. – Ravi

12

Można użyć os.getenv dostęp do zmiennych środowiskowych z Pythona:

import os 
import test 
test.printfoo(os.getenv('foo')) 

Jednak, aby do zmiennych środowiskowych, które mają być przekazywane z Basha do wszelkich procesów, które tworzy, należy wyeksportować je za pomocą export builtin: Zamiast używać zmiennych środowiskowych, możesz po prostu przekazać parametry bezpośrednio w wierszu poleceń. Wszelkie przekazane do Python po -c command opcje ładowane do sys.argv tablicy:

# Pass two arguments 'foo' and 'bar' to Python 
python - foo bar <<EOF 
import sys 
# argv[0] is the name of the program, so ignore it 
print 'Arguments:', ' '.join(sys.argv[1:]) 
# Output is: 
# Arguments: foo bar 
EOF 
Powiązane problemy