2016-05-17 7 views
0
subprocess.run('export FOO=BAR', shell=True) 

これは単純に機能しません。理由はわかりません。Pythonsのサブプロセスで 'export'コマンドを実行できません。

私は私のpython(3.5.1)スクリプトから環境変数を設定しようとしています。上記の行を実行すると何も起こりません。エラーは発生せず、自分自身で環境変数をチェックすると、設定されていません。 subprocess.run()

その他のシェルコマンドなどlspwdとしての仕事、ではなく、exportを行います。

.run()がPython 3.5で追加されました(あなたがそれを認識しなかった場合)が、.call().Popen()という上記の行を試してみましたが、結果に変更はありません。

私はos.environ['FOO'] = "BAR"とpythonで環境変数を設定することができることを承知していますが、私はシェルを使用するには、私のプロジェクトに多くのコマンド、と私はexport簡単にを使用して行いますれ、一緒に文字列を複数のコマンドにする必要がありますことを期待しますos.environより。

私のプロジェクトは、マシン上で実行されているLinux上で動作します。

+0

考えてみましょう:それぞれの 'subprocess.run(shell = True)'は新しいシェルを開始します。 2つの端末を開き、ある端末で 'export FOO = BAR'と別の端末で' echo $ FOO'と入力します(別のシェルを実行する2番目の端末は新しい '$ FOO'値を表示しません)。これは、 'cd'がシェル組み込みであるのと同じ理由です(現在のプロセスの作業ディレクトリを変更し、別のプログラムであれば' cd'は親プロセスの環境を変更する必要があります)。 (通常))。 [親プロセスの作業ディレクトリを設定するにはどうすればいいですか?](http://stackoverflow.com/q/2375003/4279) – jfs

答えて

3

正常に動作します。ただし、変数設定はサブプロセスにのみ存在します。子プロセスからローカルプロセスの環境に影響を与えることはできません。

os.environは、ローカルプロセスの環境を変更するため、正しい解決策であり、これらの変更はsubprocess.runで開始されたプロセスによって継承されます。

あなたはまたrunenv引数を使用することができます。

subprocess.run(["cmdname", "arg1", "arg number 2"], env=dict(FOO='BAR', **os.environ)) 

これは、現在の環境を変更せずにFOO=BARを含ん修正環境でコマンドを実行します。

+0

Ahhh。だから私は 'os.environ'を使う唯一の選択肢ですか、それとも何か他に何かできますか? – 99lives

+0

私は 'os.environ'をそれほど使わないことになぜ反対しているのか分かりません。これは、シェルスクリプトでシェルの組み込みの 'export'コマンドを使うことと同じです。 – chepner

+0

私が言ったように、私は複数のコマンドを一緒にストリングすることを期待しています。私は、別のPython関数で実行するのではなく、実行する必要があるコマンドのリストに 'export'を追加する方が簡単だと思います。それはいいですが、私は何かを把握することができます。あなたの答えをありがとう、それは私が期待どおりに動作していなかった理由を説明した:) – 99lives

関連する問題