pythonコードから自動的に設定したい環境変数を必要とするインストゥルメントがあります。そのため、いくつかの方法を試してみましたが、どれも成功しませんでした。以下にいくつかの例を示します。
pythonスクリプトに次のコードを挿入します
import os
os.system("export ENV_VAR=/some_path")
私はbashスクリプト(env.sh)を作成し、それをpythonから実行しました。
#!/bin/bash
export ENV_VAR=some_path
#call it from python
os.system("source env.sh")
Pythonを使用して、つまり直接シェルにエクスポートせずに環境変数を設定(エクスポート)することは可能ですか?
「楽器」(私が想定したスクリプト)をまったく同じプロセスから開始する限り、機能するはずです。
In [1]: os.putenv("VARIABLE", "123")
In [2]: os.system("echo $VARIABLE")
123
別のプロセスまたは親プロセスの環境変数を変更することはできません。
環境変数を設定すると、現在のプロセスとそれが起動するすべての子プロセスに対してのみ環境変数が設定されます。したがって、os.system
を使用すると、指定したコマンドを実行するために実行中のシェルにのみ設定されます。そのコマンドが完了すると、シェルはなくなり、環境変数も消えます。 os.putenv
またはos.environ
を使用して設定しても同様の効果があります。環境変数はPythonプロセスとそのすべての子に対して設定されます。
スクリプトを起動するシェルに、またはグローバルにこれらの変数を設定しようとしていると思います。シェル(または他のプロセス)は、変数を設定しているPythonスクリプトの子ではないため、機能しません。
シェルスクリプトで変数を設定する方が幸運です。次に、そのスクリプトをsource
(サブシェルではなくシェルの現在のインスタンスで実行されるようにする)場合、スクリプトの終了後も設定されたままになります。
インストゥルメントの実行方法によっては、親に影響を与えることなく、子プロセス専用の環境を変更できる場合があります。子環境を示す個別の引数を受け入れる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"})