2013-07-02 5 views
20

Sto eseguendo uno script bash (test.sh) e viene caricato nelle variabili di ambiente (da env.sh). Funziona bene, ma sto cercando di vedere python può solo caricare le variabili già nello script di bash.Leggi le variabili Bash in uno script Python

Sì, lo so che probabilmente sarebbe più semplice passare solo le variabili specifiche di cui ho bisogno come argomenti, ma ero curioso di sapere se fosse possibile ottenere le variabili 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) 

risposta

29

È necessario esportare le variabili in bash, o saranno locale per bash :

export test1 

Poi, in pitone

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

Sono curioso, c'è un modo semplice per esportare tutte le variabili? –

+1

@TallPaul Il dizionario 'os.environ' contiene già tutte le variabili che possono essere viste dal programma. – Bakuriu

+8

'set -a; fonte env.sh; imposta + a'. L'opzione '-a' indica a' bash' di esportare ogni nuova variabile fino a quando non la si disattiva con '+ a'. – chepner

4

Assumendo le variabili di ambiente che ottengono insieme sono permanenti, che credo non lo sono. È possibile utilizzare os.environ.

os.environ["something"] 
+0

John come impostarei le variabili in modo permanente? –

+0

aggiungi 'set -a' prima del comando' ource' (su una riga separata). Questo dice che d'ora in avanti qualsiasi serie di variabili dovrebbe essere esportata automaticamente. –

+1

@TallPaul, è come dice AMADANON Inc. Tuttavia puoi impostare le variabili per l'ambiente corrente [da python] (http://stackoverflow.com/a/1339904/322909). – John

1

C'è un altro modo utilizzando subprocess che non dipende su come impostare l'ambiente. Con un po 'più di codice, però.

Per uno script di shell che assomiglia segue:

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

function print_myvar() { 
    echo $myvar 
} 

È possibile recuperare il valore della variabile o anche chiamare una funzione nello script di shell come nel seguente codice Python:

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

Si noti che sia impostato shell=True per elaborare il comando shell in CMD da elaborare così com'è e impostare executable='bin/bash' per utilizzare la sostituzione di processo, che non è supportata dall'impostazione predefinita /bin/sh.

+0

Questo ha funzionato perfettamente! –