2016-08-16 44 views
2

私はPythonコードから自動的に設定したい環境変数を必要とする楽器を持っています。だから私はそれを実現させるためにいくつかの方法を試しましたが、どれも成功していませんでした。ここ は、いくつかの例は以下のとおりです。Pythonスクリプトでシェル環境変数を設定する

  1. 私はbashスクリプト(env.sh)を作成してのpythonから、それを実行

    import os 
    os.system("export ENV_VAR=/some_path") 
    
  2. 私のPythonスクリプトに次のコードを挿入します。

    #!/bin/bash 
    export ENV_VAR=some_path 
    
    #call it from python 
    os.system("source env.sh") 
    
  3. 私も試しましたos.putenv()os.environ ["ENV_VAR"] = "some_path"

それが直接それがシェルにエクスポートせずにすなわち(輸出)環境変数使用してのpython、 を設定することは可能ですか?

+0

は、Pythonスクリプト内から開始されたこの "楽器" となっていますか? –

+0

はい、私はPATH env varを変更する必要があります。 –

+0

すべてのプロセスには、書かれている言語にかかわらず、環境ブロックがあります。シェルは必要ありません。環境ブロックは 'fork()'を実行したときに、親から子にコピーされます(他のときはコピーされません)。 – cdarke

答えて

0

限り、あなたはそれが動作するはずです非常に同じプロセスから「楽器」(私は仮定スクリプト)を開始すると:

In [1]: os.putenv("VARIABLE", "123") 

In [2]: os.system("echo $VARIABLE") 
123 

あなたが別のプロセスの環境変数または親を変更することはできません。プロセス。

4

環境変数を設定すると、現在のプロセスおよび起動する子プロセスに対してのみ設定されます。したがって、os.systemを使用すると、指定したコマンドを実行するために実行しているシェルに対してのみ設定されます。そのコマンドが終了すると、シェルは消え、環境変数も消えます。 os.putenvまたはos.environを使用して設定すると、同様の効果があります。環境変数はPythonプロセスとその子プロセスに設定されます。

スクリプトを起動するシェルに対して、またはグローバルにこれらの変数を設定しようとしていると仮定します。これは、シェル(または他のプロセス)が変数を設定しているPythonスクリプトの子ではないので機能しません。

シェルスクリプトで変数を設定する方がよいでしょう。 sourceそのスクリプト(そのため、サブシェルではなくシェルの現在のインスタンスで実行されるように)は、スクリプトが終了した後も設定されたままになります。

0

計測器の実行方法によっては、親プロセスに影響を与えずに、子プロセス専用の環境を変更することができます。子環境を表す別の引数を受け入れるos.spawn*eまたはsubprocess.Popenのドキュメントを参照してください。たとえば、両方の用法を提供Replacing the os.spawn familysubprocessにおけるモジュールのドキュメント:

環境の例:

os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env) 
==> 
Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"}) 
関連する問題