web-dev-qa-db-ja.com

pythonスクリプトを使用してシェル環境変数を設定する

pythonコードから自動的に設定したい環境変数を必要とするインストゥルメントがあります。そのため、いくつかの方法を試してみましたが、どれも成功しませんでした。以下にいくつかの例を示します。

  1. pythonスクリプトに次のコードを挿入します

    import os
    os.system("export ENV_VAR=/some_path")
    
  2. 私はbashスクリプト(env.sh)を作成し、それを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を使用して、つまり直接シェルにエクスポートせずに環境変数を設定(エクスポート)することは可能ですか?

7
Sergey Asryan

「楽器」(私が想定したスクリプト)をまったく同じプロセスから開始する限り、機能するはずです。

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

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

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

5
Stan Prokop

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

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

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

17
kindall

インストゥルメントの実行方法によっては、親に影響を与えることなく、子プロセス専用の環境を変更できる場合があります。子環境を示す個別の引数を受け入れるos.spawn*eまたはsubprocess.Popenのドキュメントを参照してください。たとえば、両方の使用法を提供するsubprocessモジュールのドキュメントの os.spawnファミリの置き換え

環境の例:

os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env)
==>
Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"})
0
mike.dld