2013-05-14 10 views
5

が動作していない:
k.sh:Pythonスクリプトでシェル変数を使用すると、私は特定のパラメータは以下のように設定されているシェルスクリプトを持って

export var="value" 
export val2="value2" 

それから私は私が呼び出していますPythonスクリプトを持っていますシェルスクリプトとは、これらの環境変数を使用したい
ex1.py:

import subprocess 
import os 
subprocess.call("source k.sh",shell=True) 
print os.environ["var"] 

しかし、私は得ているKeyError
どのように私のPythonスクリプトでこれらのシェル変数を使用することができますか?

+0

'subprocess.call'ではなく' os.system'で動作しますか? – SethMMorton

+0

@SethMMorton:いいえ、それはos.system – ftw

+0

で動作しません。これはお勧めできません。問題はなぜあなたがこれをやろうとしているかということです。ここで本当に何をしたいですか?変数を親に返すだけですか? – cmd

答えて

1

subprocess.callは、新しいプロセスでシェルを起動します。このプロセスは、sourceを呼び出します。プロセス内の環境を子プロセスから変更する方法はありません。

+0

これは完全には役立たない。私はあなたがサブプロセスの環境に乗ることができると確信しています。 – Marcin

+0

@Marcinそれは子プロセスの助けを必要とするか(例えば、環境を印刷して親プロセスから読み返すなど)、はるかに関与したものです。それは簡単ではありません。親の 'os.environ'を使って作業するつもりはありません。 – robertklep

0

chepnerが指摘しているとおりです。 You'rサブプロセス部分は個別に実行されます。環境変数を使用した作業 は、例えば

... Pythonスクリプトを起動する前に行う必要があります。

C:\Users\anton\Desktop\githubs>echo %x% 
y 

C:\Users\anton\Desktop\githubs>python 
Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import os 
>>> os.environ['x'] 
'y' 
>>> 

は、しかしダウントラバースするスクリプトを起動する前に環境変数を調達、あるいは場合は、あなたは、複数の実行あなたがそれをソースした後にも素晴らしいサブプロセス呼び出しに対するコマンド。例えば:

import subprocess 
import os 
x = subprocess.call("source k.sh",shell=True, STDIN=subprocess.PIPE, STDOUT=subprocess.PIPE) 
y = subprocess.call("echo $var",shell=True, STDIN=x.stdout, STDOUT=subprocess.PIPE) 

言われたように、それを試したことはありません。打ち上げ前にソースを出す。

2

あなたはJSONとしてos.environの内容を印刷するk.sh実行Pythonのワンライナーを調達できました。次に、あなたのメインプロセスに戻って辞書にその出力を変換するためにjson.loadsを使用します。

import subprocess 
import os 
import json 
PIPE = subprocess.PIPE 
output = subprocess.check_output(
    ". ~/tmp/k.sh && python -c 'import os, json; print(json.dumps(dict(os.environ)))'", 
    shell=True) 
env = json.loads(output) 
print(env["var"]) 

利回り

value 
1

あなたは、環境を設定し、Pythonスクリプトを実行したい場合は、よく、環境を設定します

ランナー

ランナーを使用してPythonスクリプトを実行します210
#! /bin/bash 
. k.sh 
exec ex1.py 

とそれだけです。

ex1.py

#import subprocess 
import os 
#subprocess.call("source k.sh",shell=True) 
print os.environ["var"] 
0

/U/unutbuは既にこの質問に答えました。しかし、私は彼のコードのバグのカップルを固定:

def run_external_script(script): 
    if is_windows(): 
     command = script+" && python -c \"import os; print dict(os.environ)\"" 
    else: 
     command = ". "+ script+" && python -c 'import os; print dict(os.environ)'" 

    output = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True).communicate()[0] 
    r = re.compile('{.*}') 
    m = r.search(output) 
    try: 
     env = eval(m.group(0)) 
    except: 
     error("Something went wrong in " + script) 
     error(output) 
    return env 

小さな違いがいくつかあります:

  • このコードは、両方のは、Windows上で動作し、私はsubprocess.callでsubprocess.check_outputを置き換え
  • /Linuxは、 、check_outputにPython 2.7が必要です
  • コードを実行すると、出力変数にはスクリプトの標準出力も表示されます。だから私は{'var1' = 1、 'var2' = 'x'}のように2つの{}の間のすべての辞書をつかむためにreを使いました。
  • jsonを使用する代わりに、私はpythonのevalを使用しました。注射の機会がありますので、自己責任で使用してください。 {; exit(1); }
関連する問題