J-Quants をはじめ、外部 API を使う学習では API キーなどの認証情報 を扱う場面が必ず出てきます。これらをコードに直書きすると、Git や生成AI 経由で 意図せず外部へ漏れる事故 につながります。

本記事では、.env ファイルと python-dotenv を中心に、学習プロジェクトでも事故を起こしにくい運用をまとめます。

目次

  1. 守るべき 3 つの原則
  2. .env ファイルの書き方
  3. .gitignore への登録(最重要)
  4. python-dotenv で読み込む
  5. API キーをコードに混ぜないコード例
  6. 環境変数を OS 側で設定する選択肢
  7. 生成AI を使うときの注意
  8. 誤って .env をコミットしてしまったとき
  9. チェックリスト

守るべき 3 つの原則

最初に結論を書きます。学習用途で守るべきは次の 3 点です。

  1. コードに直書きしない:api_key = "sk-..." は禁止。値は環境変数または .env 経由で読む
  2. .env は Git に入れない:.gitignore に必ず登録する
  3. 生成AI に貼り付けない:プロンプトに API キーを混ぜない

3 つ目は、生成AI ツールが学習に使う・ログに残る前提を踏まえると重要度が高い項目です。コードを質問するときは、鍵の部分を架空値に書き換えてから貼る 癖を付けます。

.env ファイルの書き方

プロジェクトのルートに .env というファイルを作ります。中身は KEY=value の形式です。

.env
JQUANTS_MAILADDRESS=user@example.com
JQUANTS_PASSWORD=replace-with-real-password
JQUANTS_API_KEY=replace-with-real-api-key

値はクオートで囲まなくて構いません。空白を含む値は囲みます。値の中に # を含む場合は引用符で囲みます。

.gitignore への登録(最重要)

.env を Git に入れないため、.gitignore に登録します。

.gitignore
.env
.env.*
!.env.example

.env.*.env.local などの派生ファイルもまとめて除外し、!.env.exampleテンプレート用ファイルだけ例外的に追跡 する書き方が定番です。

.env.example を用意する

.env.exampleキー名だけを書いた空の雛形 で、Git に入れて公開して構いません。

.env.example
JQUANTS_MAILADDRESS=
JQUANTS_PASSWORD=
JQUANTS_API_KEY=

リポジトリを clone した直後、cp .env.example .env でコピーして値を埋めるという運用が回しやすくなります。

python-dotenv で読み込む

.env を Python から読むライブラリが python-dotenv です。

インストール

Terminal window
pip install python-dotenv

使い方

import os
from dotenv import load_dotenv
# .env を環境変数に読み込む(同じディレクトリにある前提)
load_dotenv()
mail = os.environ["JQUANTS_MAILADDRESS"]
password = os.environ["JQUANTS_PASSWORD"]
print(mail)

load_dotenv() を呼んだ後は、Python 標準の os.environ から値を取り出します。os.getenv("KEY", "default") を使うと、未設定時のデフォルト値を渡せます。

Notebook での使い方

Jupyter Notebook でも同じです。最初のセルで load_dotenv() を呼ぶだけで、以降のセルから環境変数として読めます。

from dotenv import load_dotenv
load_dotenv()

API キーをコードに混ぜないコード例

良い例と悪い例を並べて確認します。

# 悪い例: コードにキーを直書き
import requests
API_KEY = "sk-real-key-dont-do-this"
res = requests.get("https://api.example.com/data", headers={"Authorization": f"Bearer {API_KEY}"})
# 良い例: 環境変数経由で読み込む
import os
import requests
from dotenv import load_dotenv
load_dotenv()
api_key = os.environ["EXAMPLE_API_KEY"]
res = requests.get(
"https://api.example.com/data",
headers={"Authorization": f"Bearer {api_key}"},
)

呼び出しコードに鍵そのものが現れない構造を維持します。

環境変数を OS 側で設定する選択肢

.env を使わず、OS の環境変数として設定する方法もあります。長期運用ではこちらのほうが堅牢です。

Terminal window
# macOS / Linux(zsh)
export JQUANTS_API_KEY="your-api-key"
# Windows(PowerShell の現在セッションのみ)
$env:JQUANTS_API_KEY = "your-api-key"

~/.zshrc などに書くと永続化できますが、他人と共有する PC では避ける のが無難です。学習用途なら .env 方式で十分です。

生成AI を使うときの注意

生成AI でコードを書いてもらうとき、エラーログやコードを丸ごと貼ることがあります。そのままだとキーが流出する ため、貼る前に以下を機械的に置換する習慣を付けます。

元の値貼り付け時に置き換える例
実際の API キー<API_KEY>
実メールuser@example.com
パスワード<PASSWORD>
実 URL のクエリパラメータを伏せる

ツール固有の機能(プロンプト履歴の無効化など)に頼るのではなく、手元で潰してから貼る のが原則です。

誤って .env をコミットしてしまったとき

最悪のケースは、.env.gitignore に入れる前に git add . && git commit && git push してしまうパターンです。対処の優先順位は次の通りです。

  1. 対象 API のキー / トークンを直ちに再発行 する(これが最優先)
  2. リポジトリの履歴からファイルを除去する(git rm --cached → 履歴書き換え)
  3. リモートから push し直す
  4. クローンしている全員に再 clone を依頼する

「履歴を綺麗に消すこと」より、鍵を無効化すること が先です。再発行が間に合えば、流出した古い鍵は使えなくなります。

チェックリスト

学習プロジェクトを始めるときに 1 度だけ確認しておきたい内容です。

  • .env.gitignore に入っている
  • .env.example がリポジトリに入っている
  • load_dotenv() を呼んでから os.environ 経由で読んでいる
  • API キーを生成AI への貼り付けで送っていない
  • OS や Drive にバックアップを取るときも .env 込みで取っていないか確認した

まとめ

  • API キーは コードに直書きせず.env + os.environ 経由で読む
  • .env必ず .gitignore に入れ、.env.example を雛形として残す
  • python-dotenv の load_dotenv() で読み込む
  • 生成AI に貼る前に キーを架空値へ置換する 習慣を付ける
  • 誤って公開してしまったら、鍵の再発行が最優先