note.nkmk.me

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

Date: 2018-07-12 / tags: Python

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

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.environget()メソッドを使うと、存在しない場合にはデフォルト値を取得できる。辞書と同じ。

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()メソッドと同様、キーが存在しない場合はデフォルト値を返す。環境変数の値を取得して確認するだけならこの関数が便利。

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のキー(環境変数名)を指定して値を代入するほうが望ましい。

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

環境変数を削除

環境変数を削除するにはos.environpop()メソッドや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のキー(環境変数名)を指定して削除するほうが望ましい。

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

環境変数変更の影響

繰り返し書いているようにos.environの環境変数を変更(設定・削除)してもシステムの環境変数が変更されるわけではないが、プログラム中で起動されるサブプロセスには影響を与える。

言語設定の環境変数LANGによって日時を表示するコマンドdateの結果が変わる例を示す。Windowsでは環境変数LANGがなくdateコマンドの内容も違うため以下のコードは期待通りに動作しないので注意。

subprocessモジュールでdateコマンドを呼び出している。

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()メソッドを使っているが、完全一致で判定したい場合は==で比較すればOK。

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')
# こんにちは

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

スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事