Pythonで環境変数を設定する方法


658

Pythonスクリプトでいくつかの環境変数を設定する必要があります。また、Pythonから呼び出される他のすべてのスクリプトで環境変数が設定されていることを確認します。

私が行った場合

os.environ["DEBUSSY"] = 1`

それは1文字列である必要があると不平を言う。

また、Pythonの環境変数を(スクリプトの後の部分で)設定した後、それを読み取る方法も知りたいです。



また関連:youtu.be/ScyxIfOuSXs
t

質問とは無関係:私はその変数を読みました。通りの名前の猫
アーメド

回答:


790

環境変数は文字列でなければならないので、

os.environ["DEBUSSY"] = "1"

変数DEBUSSYを文字列に設定します1

この変数に後でアクセスするには、次のコードを使用します。

print(os.environ["DEBUSSY"])

子プロセスは、親プロセスの環境変数を自動的に継承します。ユーザー側で特別なアクションを行う必要はありません。


20
一部のプラットフォームでは、os.environを変更しても、現在のプロセスまたは子プロセスのシステム環境は実際には変更されません。詳細については、ドキュメントを参照してください:docs.python.org/2/library/os.html#os.environ
Evan

8
@EvanをサポートしていないUnixの歴史的な変種があるかもしれませんputenv()が、それらのUnixenにはとにかくできることは何もありません。私が使用していた古いバージョンのAIXとHPUXでもサポートしていました。今日誰かがそれをサポートしていないコンピューターを実際に見つけることができるなら、私は彼らがそのコンピューターでPythonを実行することができるかどうか深刻な疑いがあります。:)
Sven Marnach

3
注意:上記の@Evanのリファレンスから引用するとこのような環境の変更は、os.system()、popen()またはfork()およびexecv()で開始されたサブプロセスに影響します。 つまり、この方法ではプログラムの実行方法は変更されず、プログラムの子の実行方法のみが変更されることに注意してください。確かに、プログラムは環境変数を設定して読み戻すことができますが、その子用に構成した環境からのみです。参照:現在のプロセス環境の変更。これまでのところ、Pythonスクリプトがその親環境を変更する方法を見つけていません。
CODE-REaD 2016年

1
自動的にbashのようなシェルのための真の親プロセスの環境を継承文の「子プロセス@SvenMarnachです。
クリシュナOZA

@darth_coder Unixライクなオペレーティングシステム上のすべてのプロセスに当てはまります。他のオペレーティングシステムについてはわかりません。シェル変数は、エクスポートしない限り、環境に格納されないことに注意してください。
Sven Marnach 2017年

114

コードの堅牢性については、さらにいくつかの側面を考慮する必要があるかもしれません。

整数値の変数を環境変数として保存する場合は、

os.environ['DEBUSSY'] = str(myintvariable)

次に、取得のために、エラーを回避するために、

os.environ.get('DEBUSSY', 'Not Set')

'Not Set'を '-1'に置き換えてください

それをまとめると

myintvariable = 1
os.environ['DEBUSSY'] = str(myintvariable)
strauss = int(os.environ.get('STRAUSS', '-1'))
# NB KeyError <=> strauss = os.environ['STRAUSS']
debussy = int(os.environ.get('DEBUSSY', '-1'))

print "%s %u, %s %u" % ('Strauss', strauss, 'Debussy', debussy)

3
Linuxマシンで変数を設定する方法を教えてください。コードはすべてのプラットフォームで同じですか?
Anurag-Sharma 2014

2
不足している整数に対して-1を格納することはほとんど意味がありません。より良い賭けはmyvar = int(os.environ.get('MYVAR')) if os.environ.get('MYVAR', '') != '' else None–番号が提供されない場合はそれでNoneになる
ベンジャミンアトキン

1
整数を扱う場合は、-1が意味を成します。変数/定数を設定しないために使用する値に設定する可能性があります(例:)value_not_set = '-1'。その後、使用できますdebussy = int(os.environ.get('DEBUSSY', value_not_set))
yeOldeDataSmythe

68

os.environPythonディクショナリのように動作するため、一般的なすべてのディクショナリ操作を実行できます。他の回答に記載されているgetset操作に加えて、キーが存在するかどうかを簡単に確認することもできます。キーと値は文字列として保存する必要があります

Python 3

Python 3の場合、辞書はhas_keyの代わりにinキーワードを使用します

>>> import os
>>> 'HOME' in os.environ  # Check an existing env. variable
True
...

Python 2

>>> import os
>>> os.environ.has_key('HOME')  # Check an existing env. variable
True
>>> os.environ.has_key('FOO')   # Check for a non existing variable
False
>>> os.environ['FOO'] = '1'     # Set a new env. variable (String value)
>>> os.environ.has_key('FOO')
True
>>> os.environ.get('FOO')       # Retrieve the value
'1'

使用に関して注意すべき重要なことが1つありますos.environ

子プロセスは親プロセスから環境を継承しますが、最近問題に遭遇しました。Pythonスクリプトの実行中に他のスクリプトが環境を更新している場合、os.environ再度呼び出しても最新の値が反映されません

ドキュメントからの抜粋:

このマッピングは、osモジュールが最初にインポートされたときに、通常はPythonの起動時にsite.pyの処理の一部としてキャプチャされます。この時間以降に行われた環境への変更は、os.environを直接変更して加えられた変更を除いて、os.environには反映されません。

os.environ.data すべての環境変数を格納するdictオブジェクトであり、すべての環境値が含まれています。

>>> type(os.environ.data)  # changed to _data since v3.2 (refer comment below)
<type 'dict'>

1
プロセスの環境変数は、プロセスの作成時に設定されます。この後に行われた変更は、プロセス自体の環境変数のコピーには影響しません。これはPythonだけでなく、すべてのプロセスに共通です。さらに、os.environ.dataPython 3.2 でに名前が変更されましos.environ._dataた。アンダースコアの接頭辞は、直接読み取るべきではないことを示しています。とにかく、os.environ._data値が更新されることはありません。
Al Sweigart

はい、わかりました。私の最初の驚きを他の人に見てもらいたいと思いました。3.2以降の変数名の更新を指摘していただきありがとうございます。回答が更新されます。
18

21

os.environ ["DEBUSSY"] = 1を実行すると、1は文字列でなければならないというメッセージが表示されます。

それから

os.environ["DEBUSSY"] = "1"

設定したら、Pythonで環境変数を読み取る方法(スクリプトの後半)も知りたいです。

os.environ["DEBUSSY"]ように、

some_value = os.environ["DEBUSSY"]

19

変数を設定するには:

キーを使用したアイテムの割り当て方法:

import os    
os.environ['DEBUSSY'] = '1'  #Environ Variable must be string not Int

それが存在するかどうかを取得または確認するには、

os.environはインスタンスなので、オブジェクトを試すことができます。

方法1:

os.environ.get('DEBUSSY') # this is error free method if not will return None by default

'1'戻り値として取得されます

方法2:

os.environ['DEBUSSY'] # will throw an key error if not found!

方法3:

'DEBUSSY' in os.environ  # will return Boolean True/False

方法4:

os.environ.has_key('DEBUSSY') #last 2 methods are Boolean Return so can use for conditional statements

16

文字列値を環境変数に割り当てる必要があります。

os.environ["DEBUSSY"] = "1"

環境変数を読み取りまたは印刷したい場合は、

print os.environ["DEBUSSY"]

この変更は、割り当てられた現在のプロセスに対してのみ有効であり、値を永続的に変更することはありません。子プロセスは、親プロセスの環境を自動的に継承します。

ここに画像の説明を入力してください


5
「この変更は、割り当てられた現在のプロセスに対してのみ有効です。値が永続的に変更されることはありません。」これは、環境変数の設定範囲についての質問に答えました。
spitfiredd

2
Pythonシェルを終了し、以前に設定されたos環境がなくなった場合。
MeadowMuffins 2017

Windowsで環境変数を設定するにはどうすればよいですか?私は試しましたset [<name>=[<value>]]が、それは現在実行中のプロセスに対してのみ行われます。私がcmdを閉じるとき、それは存在せず、それが開いているときでさえ、他のプログラムはそれを見ることができません。
フィリップ


14

環境変数を追加しようとしています。私の目標は、構成ファイルの代わりとして、将来のソリューションでこれらの変数を使用できるように、いくつかのユーザー情報をシステム変数に格納することでした。ただし、以下のコードで説明されている方法はまったく役に立ちませんでした。

import os
os.environ["variable_1"] = "value_1"
os.environ["variable_2"] = "value_2"
# To Verify above code
os.environ.get("variable_1")
os.environ.get("variable_2")

この単純なコードブロックは適切に機能しますが、これらの変数はそれぞれのプロセス内に存在するため、Windowsシステム設定の[環境変数]タブには表示されません。上記のコードのほとんどは私の目的を果たしませんでした。この問題については、ここで説明します:変数の保存の問題

os.environ.putenv(key, value)

別の失敗した試み。したがって、最後に、osパッケージのシステムクラス内にラップされたWindowsシェルコマンドを模倣することにより、ウィンドウ環境レジスタ内に変数を正常に保存することができました。次のコードは、この成功した試みを示しています。

os.system("SETX {0} {1} /M".format(key, value))

これがあなたの一部に役立つことを願っています。


12

あなたがbashの評価に環境変数を設定しようとすると、それがあることに注意すべきではないでしょう、あなたが期待するもの格納します。例:

from os import environ

environ["JAVA_HOME"] = "$(/usr/libexec/java_home)"

これはシェルでのようにそれを評価しないので/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home、パスとして取得する代わりに、リテラル式を取得します$(/usr/libexec/java_home)

次のように、環境変数を設定する前に必ず評価してください。

from os import environ
from subprocess import Popen, PIPE

bash_variable = "$(/usr/libexec/java_home)"
capture = Popen(f"echo {bash_variable}", stdout=PIPE, shell=True)
std_out, std_err = capture.communicate()
return_code = capture.returncode

if return_code == 0:
    evaluated_env = std_out.decode().strip()
    environ["JAVA_HOME"] = evaluated_env
else:
    print(f"Error: Unable to find environment variable {bash_variable}")

11

あなたは使用することができos.environ、あなたの環境変数にアクセスするための辞書を。

今、私が持っていた問題os.systemは、環境変数を設定するバッチファイルを実行しようとした場合(**。bat *ファイルのSETコマンドを使用)、実際にはそれらをPython環境に設定しないことです(ただし、os.system関数で作成された子プロセス)。実際にPython環境で設定された変数を取得するには、次のスクリプトを使用します。

import re
import system
import os

def setEnvBat(batFilePath, verbose = False):
    SetEnvPattern = re.compile("set (\w+)(?:=)(.*)$", re.MULTILINE)
    SetEnvFile = open(batFilePath, "r")
    SetEnvText = SetEnvFile.read()
    SetEnvMatchList = re.findall(SetEnvPattern, SetEnvText)

    for SetEnvMatch in SetEnvMatchList:
        VarName=SetEnvMatch[0]
        VarValue=SetEnvMatch[1]
        if verbose:
            print "%s=%s"%(VarName,VarValue)
        os.environ[VarName]=VarValue

9

環境変数(変数の追加/変更/削除)を操作する場合、関数の完了時に以前の状態を復元することをお勧めします。

環境変数を復元するにはmodified_environ、この質問で説明するコンテキストマネージャのようなものが必要になる場合があります。

クラシックな使い方:

with modified_environ(DEBUSSY="1"):
    call_my_function()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.