2013-07-02 21 views
20

私はbashスクリプト(test.sh)を実行しており、環境変数(env.shから)に読み込みます。それはうまく動作しますが、私はPythonがすでにbashスクリプト内の変数にロードできるかどうかを確認しようとしています。Bash変数をPythonスクリプトに読み込む

はい私は引数として必要な特定の変数を渡す方が簡単かもしれないことは知っていますが、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) 

答えて

29

あなたはbashで変数をエクスポートする必要がある、または彼らはbashのにローカルになります:

export test1 

はその後、Pythonでセットを取得する環境変数を想定し

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

私は不思議です、すべての変数をエクスポートする簡単な方法はありますか? –

+1

@TallPaul 'os.environ'ディクショナリには、すでにプログラムが見ることができるすべての変数が入っています。 – Bakuriu

+8

'set -a;ソースenv.sh; + aをセットする。 '-a'オプションは' bash'に '+ a'でそれをオフにするまで新しい変数をそれぞれエクスポートするよう指示します。 – chepner

4

は、私は、彼らがいないと思いますこれは、永続的です。 os.environを使用できます。

os.environ["something"] 
+0

ジョンどのように変数を永久に設定するのですか? –

+0

'ource'コマンドの前に' set -a'を追加します(別の行に)。これは今から、変数セットが自動的にエクスポートされるべきだということです。 –

+1

@TallPaul、それはAMADANON Inc.と同じです。しかし、あなたは現在の環境[python](http://stackoverflow.com/a/1339904/322909)の変数を設定することができます。 – John

1

を。しかし、もう少しコードで。以下のように見えるシェルスクリプトの

は次のとおりです。

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

function print_myvar() { 
    echo $myvar 
} 

をあなたは、変数の値を取得したりしても、次の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') 

CMDのシェルコマンドをそのまま処理するには、shell=Trueの両方を設定し、デフォルトの/bin/shではサポートされていないプロセス置換を使用するようにexecutable='bin/bash'を設定する必要があります。

+0

これは完全に機能しました! –

関連する問題