2013-07-02 14 views
20

Uruchomiłem skrypt bash (test.sh) i ładuje on zmienne środowiskowe (z env.sh). Działa to dobrze, ale próbuję zobaczyć, że Python może po prostu wczytać zmienne znajdujące się już w skrypcie Bash.Czytaj zmienne Bash w skrypcie Pythona

Tak, wiem, że łatwiej byłoby po prostu przekazać określone zmienne, które potrzebuję jako argumenty, ale byłem ciekawy, czy można uzyskać zmienne bash.

test.sh

#!/bin/bash 
source env.sh 

echo $test1 

python pythontest.py 

env.sh

#!/bin/bash 

test1="hello" 

pythontest.py

? 
print test1 (that is what I want) 

Odpowiedz

29

Musisz wyeksportować zmienne w bash, czy będą one lokalny bash :

export test1 

Następnie w python

import os 
print os.environ["test1"] 
+0

Jestem ciekawa, czy istnieje łatwy sposób na wyeksportowanie wszystkich zmiennych? –

+1

@TallPaul Słownik "os.environ" zawiera już wszystkie zmienne, które można zobaczyć w programie. – Bakuriu

+8

'set -a; źródło env.sh; set + a'. Opcja '-a' nakazuje' bash' eksportować każdą nową zmienną, aż wyłączysz ją za pomocą '+ a'. – chepner

4

Zakładając zmienne środowiskowe, które gotowi są stałe, które myślę, że oni nie są. Możesz użyć os.environ.

os.environ["something"] 
+0

John jak ustawić zmienne na stałe? –

+0

dodaj 'set -a' przed komendą' ource' (w oddzielnym wierszu). Oznacza to, że od teraz każdy zestaw zmiennych powinien być automatycznie eksportowany. –

+1

@TallPaul, tak jak mówi AMADANON Inc. Można jednak ustawić zmienne dla bieżącego środowiska [z pythonu] (http://stackoverflow.com/a/1339904/322909). – John

1

Jest inny sposób korzystania subprocess że nie zależy od ustawienia środowiska. Jednak z nieco większym kodem.

Dla skrypt, który wygląda następująco:

#!/bin/sh 
myvar="here is my variable in the shell script" 

function print_myvar() { 
    echo $myvar 
} 

można pobrać wartość zmiennej lub nawet wywołać funkcję w skrypcie jak w poniższym kodzie Pythona:

import subprocess 

def get_var(varname): 
    CMD = 'echo $(source myscript.sh; echo $%s)' % varname 
    p = subprocess.Popen(CMD, stdout=subprocess.PIPE, shell=True, executable='/bin/bash') 
    return p.stdout.readlines()[0].strip() 

def call_func(funcname): 
    CMD = 'echo $(source myscript.sh; echo $(%s))' % funcname 
    p = subprocess.Popen(CMD, stdout=subprocess.PIPE, shell=True, executable='/bin/bash') 
    return p.stdout.readlines()[0].strip() 

print get_var('myvar') 
print call_func('print_myvar') 

Należy pamiętać, że należy ustawić zarówno shell=True, aby przetwarzać polecenie powłoki w postaci CMD, które ma być przetwarzane w niezmienionym stanie, i ustawić executable='bin/bash', aby użyć podstawienia procesu, które nie jest obsługiwane przez domyślne /bin/sh.

+0

To działało idealnie! –