Nishiki-Hub

国内外のPC/PCパーツ/スマホ/Appleなどの最新情報を取り上げています

【Python】「環境変数」でソースコードに直書きしたくない認証情報を別ファイルに分ける

本日の内容

さて、前回の記事ではAtProtocolベースのBlueskyにRSSの情報を取得してポストするという内容を扱いましたが、そこでちらっとでてきた「環境変数」についてまとめていきます。まあ、個人的に最近認証情報が必要なコードを書き始めたので、そのメモとしてのこしておきたいという思いもあります。

前回の記事はこちらからどうぞ

どういうときに使うか

まず、環境変数について。環境変数を使う場面はいくつか考えられます。例えば、認証情報を保管する目的として、トークンやID/パスワードはソースコードにベタ貼りしてしまうと、Gitなどで管理する時にものすごく面倒な事になってしまいます。

そこで、別のファイル、あるいはOS自身の環境に保存しておいて、それをプログラムで使おうという流れになるわけですね。

別では、システムによって異なるパスなどを吸収する目的でも使えるかもしれませんね。

何しか「ソースコードから秘匿にしたい情報」を環境変数を使って管理するというのが、定石かと思います。

方法

紹介する方法は.envを使います。

通常、環境変数ではos.environを用いて環境変数を設定しますが、この方法だとプログラムをまたいで編集した環境変数を使うことができませんので、「.env」というファイルに編集する環境変数と内容を予め記述しておいて、それをプログラム内で呼び出して使うというものになります。

別ファイルに保存するという関係上、Gitなどで管理するときも.gitignoreで.envを無視させることで、リモートリポジトリから排除することができるという利点もあります。

まず、ライブラリをインストールします。

pip install dotenv

次に、認証情報を格納する「.env」という名前のファイルを作成し、認証情報に合わせて次のように記述して保存します。

ID="nishikiout"
PASSWORD = "p@ssw0rd"

.envファイルでは、一行ごとに{KEY(環境変数)}="{VALUE}"のように記述することで、環境変数を設定します。プログラム内で、既存の環境変数を用いた処理をする場合、ここでその環境変数を編集してしまうと上書きされてしまうので注意が必要です。

ディレクトリ構造は

  • プロジェクト
    • .env
    • main.py

のようにしてください。

実際、Pythonでは、次に実際に取得します。

import os
from dotenv import load_dotenv

load_dotenv()

id = os.environ['ID']
passwordl = os.environ['PASSWORD']

print(f"IDは{id}、パスワードは{pass}")
【実行結果】
IDはnishikiout、パスワードはp@ssw0rd

load_dotenv()関数が.envファイルに保存した環境変数の変更内容を実際に適用するというものになっています。実際に、呼び出すときはos.environを使うので、osモジュールは必要ですね。

結構簡単に実装できるので便利ですね。

【付録】os.environだけ

最後に付録がてら、os.environを使った方法を記述しておきます。.envがあれば割と不要かもしれませんが、環境変数には、編集前から「LANG」などのシステムに関わる情報が格納されているので、実際に使うのは便利です。

実際に環境変数を取得してみます。os.environには、環境変数が辞書型で格納されていますので、実は目的とした環境変数さえあれば、あとは辞書型と同じように取得することができます。

import os

# 辞書型同様に取得
print(os.environ['LANG'] # 出力:ja_JP.UTF-8

# 存在しないキーを指定した時にNoneを返す
print(os.getenv['LANG'] # 出力:ja_JP.UTF-8
print(os.getenv['HOGE'] # 出力:None

基本的に取得方法は2つあり、前者のようにos.environが辞書型なので、キーを直接していして取得する方法と、後者のようにosモジュールに用意されたメソッドを使う方法があります。

ただし前者の場合、存在しないキー(環境変数)を指定してしまうとKeyErrorとなりますので、それを回避するのであれば、そういったときにNoneを返すos.getenvを使うほうがいいでしょう。もちろん、os.environは辞書型と同じように扱えるので、os.environ.get()でも同じように存在しないときにNoneを返す方法で取得可能です。

一方、環境変数を設定する場合は、

import os

# 辞書型同様に取得
os.environ['ID'] = "nishikiout"

のように設定するよ良いでしょう。

参考文献