web-dev-qa-db-ja.com

Pythonで環境変数の変更を固定するにはどうすればよいですか?

私が読んだところによると、Pythonインスタンス内の環境変数への変更は、そのインスタンス内でのみ利用可能であり、インスタンスが閉じられると消えます。それらを固定する方法はありますか?それらをシステムにコミットしますか?

これを行う必要がある理由は、私が働いているスタジオでは、Mayaのようなツールが複数のプラットフォーム間でパスを構成するために環境変数に大きく依存しているためです。

私のテストコードは

import os
os.environ['FAKE'] = 'C:\\'

Pythonの別のインスタンスを開き、os.environ['FAKE']を要求すると、KeyErrorが生成されます。

注:移植性が問題になりますが、私が書いている小さなAPIは、OSのバージョンを確認し、必要に応じてさまざまなコマンドをトリガーできます。

とは言うものの、私はWindowsレジストリ技術を使用するルートをたどり、要件になったときに他のプラットフォームでシェルスクリプトを呼び出す代替メソッドを作成するだけです。

21
Soviut

Windowsでは、 このレシピ を使用してレジストリを介して環境変数に永続的な変更を加えることができますが、やり過ぎのようです。

ブライアンの質問を繰り返すために、あなたは何を達成しようとしていますか?おそらくもっと簡単な方法があります。

6
Jeff Bauer

コマンドラインでSETXを使用できます。

デフォルトでは、これらのアクションはUSER環境変数で実行されます。 SYSTEM変数を設定および変更するには、/ Mフラグを使用します

import os
env_var = "BUILD_NUMBER"
env_val = "3.1.3.3.7"
os.system("SETX {0} {1} /M".format(env_var,env_val))
11

それらをシステムにコミットすることによってそれらを固執させますか?

ここで少し混乱していると思います。 「システム」環境はありません。各プロセスには、メモリの一部として独自の環境があります。プロセスは、それ自体の環境のみを変更できます。プロセスは、作成するプロセスの初期環境を設定できます。

システムの環境変数を設定する必要があると本当に思う場合は、WindowsのレジストリやLinuxのシェル構成ファイルなど、最初にロードされた場所でそれらを変更することを検討する必要があります。

9
Zoredache

私はあなたがこれを行うことができるとは思わない。私が考えることができる2つの回避策があります。

  1. os.putenv関数は、開始するプロセス、つまりos.system、popenなどの環境を設定します。実行しようとしていることに応じて、1つのマスターPythonインスタンスを設定できます。変数を作成してから、新しいインスタンスを生成します。

  2. シェルスクリプトまたはバッチファイルを実行して設定することもできますが、移植性が大幅に低下します。この記事を参照してください:

http://code.activestate.com/recipes/159462/

5
DNS

このように考えてください。

シェル環境変数を設定していません。

特定の環境変数設定を使用してサブシェルを生成しています。このサブシェルは、変更された環境でアプリケーションを実行します。

3
S.Lott

この議論 によると、あなたはそれを行うことはできません。何を達成しようとしていますか?

3
Brian

Windowsにはもっと簡単な解決策があるようです

import subprocess 
subprocess.call(['setx', 'Hello', 'World!'], Shell=True)

新しいプロセスをフォークしていて、シェルから新しいシェルプロセスを開始した場合とは異なり、親プロセスの環境を変更することはできません。

2
leancz

ActivePython に含まれている(または個別にインストールできる)Mark Hammondによって開発された Python Win32 Extensions を試してみることをお勧めします。 Hammond's and Robinson's book で多くのWindows関連タスクを実行する方法を学ぶことができます。

PyWin32を使用してウィンドウCOMオブジェクトにアクセスすると、a Pythonプログラムは、WScript.Shellオブジェクトの Environment Property (環境変数のコレクション)を使用できます。

1
gimel

Python内から?いいえ、できません!

Pythonに縛られていない場合は、シェルスクリプト(sh、bashなど)の使用を検討する必要があります。 「source」コマンドを使用すると、環境を変更するスクリプトを実行して、スクリプトを「ソース」したシェルに「固定」することができます。ここで行われているのは、シェルがサブを作成するのではなく、スクリプトを直接実行することです。 -スクリプトを実行するプロセス。

これは非常に移植性があります-これを行うには、Windowsでcygwinを使用できます。

0
Daniel Paull