Pythonで環境変数を取得・追加・上書き・削除(os.environ)

Pythonのプログラムの中で環境変数を取得して確認したり、設定(追加・上書き)、削除したりするにはos.environを使います。なお、環境変数の設定や削除による変更はそのPythonプログラムの中でのみ有効。システムの環境変数が書き換わるわけではない。

16.1. os.environ — 雑多なオペレーティングシステムインタフェース — Python 3.6.5 ドキュメント

osモジュールをインポートして使います。標準ライブラリなので追加のインストールは不要。ここでは環境変数による処理結果の違いを示す例のためにsubprocessモジュールもインポートしています。subprocessモジュールも標準ライブラリに含まれています。

import os
import subprocess

以下の内容について説明します。

os.environ 環境変数を取得 環境変数を設定(追加・上書き) 環境変数を削除 環境変数変更の影響 環境変数による処理の切り替え

os.environ

os.environの型はos._Environ。

print(type(os.environ))
# <class 'os._Environ'>

os._Environはキーkeyと値valueが対になったマップ型オブジェクトで、辞書(dict型)などと同様のメソッドを持ちます。環境変数名がkey、その値がvalueになっています。 なお、os.environの内容はosモジュールをインポートした時点で読み込まれる。プログラムの実行中に他の手段でシステムの環境変数が変更されてもos.environの内容は更新されません。 print()で一覧が表示される(ここでは省略)。

# print(os.environ)

辞書と同様にkeys()やvalues()などのメソッドを使ったり、inでキーや値の存在確認をしたりできます。

キー、値の処理も基本的には辞書と同じ。以下に例とともに示す。

環境変数を取得

os.environ[環境変数名]で環境変数の値を取得できるが、存在しない環境変数名を指定するとエラーKeyErrorになります。

print(os.environ['LANG'])
# ja_JP.UTF-8

# print(os.environ['NEW_KEY'])
# KeyError: 'NEW_KEY'

os.environのget()メソッドを使うと、存在しない場合にはデフォルト値を取得できます。辞書と同じ。

print(os.environ.get('LANG'))
# ja_JP.UTF-8

print(os.environ.get('NEW_KEY'))
# None

print(os.environ.get('NEW_KEY', 'default'))
# default

os.getenv()という関数も用意されています。辞書のget()メソッドと同様、キーが存在しない場合はデフォルト値を返します。環境変数の値を取得して確認するだけならこの関数が便利です。

16.1. os.getenv() — 雑多なオペレーティングシステムインタフェース — Python 3.6.5 ドキュメント

print(os.getenv('LANG'))
# ja_JP.UTF-8

print(os.getenv('NEW_KEY'))
# None

print(os.getenv('NEW_KEY', 'default'))
# default

環境変数を設定(追加・上書き)

os.environ[環境変数名]に値を代入すると環境変数を設定できます。 新しい環境変数名を指定するとその環境変数が新たに追加され、既存の環境変数名を指定するとその環境変数の値が上書きされます。

os.environ['NEW_KEY'] = 'test'

print(os.environ['NEW_KEY'])
# test

os.environ['NEW_KEY'] = 'test2'

print(os.environ['NEW_KEY'])
# test2

文字列以外を代入するとエラーTypeErrorになるので気をつけてください。数値を代入したい場合も文字列として指定します。

# os.environ['NEW_KEY'] = 100
# TypeError: str expected, not int

os.environ['NEW_KEY'] = '100'

os.putenv()という関数も用意されているが、os.putenv()で設定した場合はos.environの値が更新されないため、上の例のようにos.environのキー(環境変数名)を指定して値を代入するほうが望ましい。

16.1. os.putenv() — 雑多なオペレーティングシステムインタフェース — Python 3.6.5 ドキュメント

なお、最初に書いたように、環境変数の追加や上書きによる変更はそのPythonプログラムの中でのみ有効。システムの環境変数が書き換わるわけではない。

環境変数を削除

環境変数を削除するにはos.environのpop()メソッドやdel文を使います。辞書と同じ。詳細は

pop()の例を示します。 pop()は削除した環境変数の値を返します。デフォルトでは存在しない環境変数を指定するとエラーKeyErrorになるが、第二引数を指定すると環境変数が存在しない場合にその値を返します。

print(os.environ.pop('NEW_KEY'))
# 100

# print(os.environ.pop('NEW_KEY'))
# KeyError: 'NEW_KEY'

print(os.environ.pop('NEW_KEY', None))
# None

delの例を示します。 再度環境変数を追加してから削除しています。環境変数が存在しない場合はエラーKeyError。

os.environ['NEW_KEY'] = '100'

print(os.getenv('NEW_KEY'))
# 100

del os.environ['NEW_KEY']

print(os.getenv('NEW_KEY'))
# None

# del os.environ['NEW_KEY']
# KeyError: 'NEW_KEY'

os.unsetenv()という関数も用意されているが、os.putenv()と同様にos.unsetenv()で削除した場合はos.environの値が更新されないため、上の例のようにos.environのキー(環境変数名)を指定して削除するほうが望ましい。

16.1. os.unsetenv() — 雑多なオペレーティングシステムインタフェース — Python 3.6.5 ドキュメント

環境変数の削除についてもそのPythonプログラムの中でのみ有効。システムの環境変数が削除されるわけではない。

環境変数変更の影響

繰り返し書いているようにos.environの環境変数を変更(設定・削除)してもシステムの環境変数が変更されるわけではないが、プログラム中で起動されるサブプロセスには影響を与える。 言語設定の環境変数LANGによって日時を表示するコマンドdateの結果が変わる例を示す。Windowsでは環境変数LANGがなくdateコマンドの内容も違うため以下のコードは期待通りに動作しないので気をつけてください。 subprocessモジュールでdateコマンドを呼び出しています。

17.5. subprocess --- サブプロセス管理 — Python 3.6.6 ドキュメント

LANGの値によってdateの出力結果が変わる。

print(os.getenv('LANG'))
# ja_JP.UTF-8

print(subprocess.check_output('date', encoding='utf-8'))
# 2018年 7月12日 木曜日 20時54分13秒 JST
#

os.environ['LANG'] = 'en_US'

print(subprocess.check_output('date', encoding='utf-8'))
# Thu Jul 12 20:54:13 JST 2018
#

なお、ここでは説明のためos.environで環境変数LANGを変更しているが、Pythonにはロケールを制御するlocaleモジュールが用意されています。localeモジュールの利用例は

環境変数による処理の切り替え

環境変数の値に応じて処理を切り替えることもできます。 言語設定の環境変数LANGによって出力を変更する例を示す。ここでは文字列が指定した文字列で始まるかどうかを判定するstartswith()メソッドを使っているが、完全一致で判定したい場合は==で比較すれば問題ありません。

print(os.getenv('LANG'))
# en_US

if os.getenv('LANG').startswith('ja'):
    print('こんにちは')
else:
    print('Hello')
# Hello

os.environ['LANG'] = 'ja_JP'

if os.getenv('LANG').startswith('ja'):
    print('こんにちは')
else:
    print('Hello')
# こんにちは

そのほか、例えば開発環境と本番環境を示す環境変数が設定されている場合などはその値を取得して処理を切り替えたりできます。

Last Updated: 6/26/2019, 10:34:03 PM