Pythonで環境変数を使いこなす!初心者向けガイド【設定から実務活用まで】
こんにちは、とまだです。
みなさん、Pythonで開発していて「APIキーをコードに直接書くのはまずいよね...」と悩んだことはありませんか?
実は、環境変数を使えばこの問題をスマートに解決できるんです。
今回は現役のエンジニア、そして元プログラミングスクール講師としての経験から、Pythonでの環境変数の使い方について解説します。
環境変数って何?本棚で理解する基本概念
環境変数を一言で表すと、OSが管理する設定値の保管場所です。
家にある本棚を想像してみてください。
本棚には本が並んでいて、それぞれにタイトルがついています。 必要な本を取り出すときは、タイトルを見て探しますよね。
環境変数も同じような仕組みです。
# 環境変数の仕組みを本棚に例えると
環境変数(本棚)= {
"PATH": "/usr/local/bin:/usr/bin", # 本のタイトルと内容
"HOME": "/Users/username",
"API_KEY": "your-secret-key"
}
OSという本棚に、さまざまな設定値が名前付きで保管されているイメージです。
なぜPythonで環境変数を使うのか
「設定値なら、Pythonファイルに直接書けばいいのでは?」
そう思うかもしれません。
しかし、以下のようなケースを考えてみてください。
コードに秘密情報を書くリスク
# 危険な例:APIキーを直接コードに記述
api_key = "sk-1234567890abcdef" # GitHubに公開されたら大変!
database_password = "mypassword123"
このコードをGitHubにプッシュしてしまうと、世界中に秘密情報が公開されてしまいます。
環境変数を使った安全な方法
import os
# 環境変数から値を取得
api_key = os.environ.get("API_KEY")
database_password = os.environ.get("DB_PASSWORD")
環境変数を使えば、秘密情報をコードから切り離せます。
コードには「環境変数から取得する」という指示だけを書き、実際の値は別の場所で管理するんです。
WindowsでPython用の環境変数を設定する
Windowsで環境変数を設定する方法を見ていきましょう。
システム環境変数とユーザー環境変数の違い
Windowsには2種類の環境変数があります。
- システム環境変数:すべてのユーザーが使える
- ユーザー環境変数:自分だけが使える
通常は、ユーザー環境変数を使うことをおすすめします。
GUIで設定する方法
- Windowsキー + Pauseキーを押す
- 「システムの詳細設定」をクリック
- 「環境変数」ボタンをクリック
- ユーザー環境変数の「新規」をクリック
- 変数名と値を入力
コマンドプロンプトで一時的に設定
# 一時的に環境変数を設定(現在のセッションのみ有効)
set MY_API_KEY=your-secret-key
# 確認
echo %MY_API_KEY%
ただし、この方法で設定した環境変数は、コマンドプロンプトを閉じると消えてしまいます。
MacやLinuxでの環境変数設定
MacやLinuxでは、シェルの設定ファイルを編集します。
bashを使っている場合
# ~/.bashrcまたは~/.bash_profileを編集
echo 'export MY_API_KEY="your-secret-key"' >> ~/.bashrc
# 設定を反映
source ~/.bashrc
zshを使っている場合(最近のMacはこれ)
# ~/.zshrcを編集
echo 'export MY_API_KEY="your-secret-key"' >> ~/.zshrc
# 設定を反映
source ~/.zshrc
一時的な設定
# 現在のターミナルセッションのみ有効
export MY_API_KEY="your-secret-key"
# 確認
echo $MY_API_KEY
Pythonで環境変数を読み取る実践的な方法
環境変数の設定ができたら、Pythonから読み取ってみましょう。
os.environを使った基本的な読み取り
import os
# 方法1:直接アクセス(環境変数が存在しないとエラー)
try:
api_key = os.environ["MY_API_KEY"]
print(f"APIキー: {api_key}")
except KeyError:
print("環境変数MY_API_KEYが設定されていません")
os.getenv()でデフォルト値を設定
import os
# 方法2:getenvを使う(存在しない場合はNoneまたはデフォルト値)
api_key = os.getenv("MY_API_KEY", "default-key")
print(f"APIキー: {api_key}")
# 本番環境と開発環境の切り替え例
env = os.getenv("ENVIRONMENT", "development")
if env == "production":
debug_mode = False
else:
debug_mode = True
実務でよく使うパターン
import os
import sys
class Config:
"""アプリケーションの設定を管理するクラス"""
def __init__(self):
# 必須の環境変数
self.api_key = os.getenv("API_KEY")
if not self.api_key:
print("エラー: API_KEYが設定されていません")
sys.exit(1)
# オプションの環境変数(デフォルト値あり)
self.debug = os.getenv("DEBUG", "False").lower() == "true"
self.port = int(os.getenv("PORT", "8000"))
self.database_url = os.getenv("DATABASE_URL", "sqlite:///local.db")
# 使用例
config = Config()
print(f"デバッグモード: {config.debug}")
print(f"ポート番号: {config.port}")
.envファイルでスマートに環境変数を管理
多くの環境変数を管理する場合、.env
ファイルを使うと便利です。
python-dotenvのインストール
pip install python-dotenv
.envファイルの作成
プロジェクトのルートディレクトリに.env
ファイルを作成します。
# .env
API_KEY=your-secret-api-key
DATABASE_URL=postgresql://user:password@localhost/dbname
DEBUG=True
PORT=8000
Pythonで.envファイルを読み込む
from dotenv import load_dotenv
import os
# .envファイルを読み込む
load_dotenv()
# 環境変数を使用
api_key = os.getenv("API_KEY")
database_url = os.getenv("DATABASE_URL")
debug = os.getenv("DEBUG", "False").lower() == "true"
print(f"APIキー: {api_key}")
print(f"データベースURL: {database_url}")
print(f"デバッグモード: {debug}")
.gitignoreに.envを追加(重要!)
# .gitignore
.env
.env.local
.env.*.local
.envファイルには秘密情報が含まれるため、絶対にGitにコミットしないようにしましょう。
実務でよく使う環境変数のパターン
実際の開発でよく使われる環境変数のパターンを紹介します。
データベース接続情報
import os
from urllib.parse import urlparse
# DATABASE_URLから各パラメータを抽出
database_url = os.getenv("DATABASE_URL")
if database_url:
parsed = urlparse(database_url)
db_config = {
"host": parsed.hostname,
"port": parsed.port,
"user": parsed.username,
"password": parsed.password,
"database": parsed.path[1:] # 先頭の/を除去
}
APIクライアントの設定
import os
import requests
class APIClient:
def __init__(self):
self.api_key = os.getenv("API_KEY")
self.base_url = os.getenv("API_BASE_URL", "https://api.example.com")
self.timeout = int(os.getenv("API_TIMEOUT", "30"))
def get_data(self, endpoint):
headers = {"Authorization": f"Bearer {self.api_key}"}
response = requests.get(
f"{self.base_url}/{endpoint}",
headers=headers,
timeout=self.timeout
)
return response.json()
ログレベルの制御
import os
import logging
# 環境変数でログレベルを制御
log_level = os.getenv("LOG_LEVEL", "INFO").upper()
numeric_level = getattr(logging, log_level, logging.INFO)
logging.basicConfig(
level=numeric_level,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
logger.debug("デバッグメッセージ")
logger.info("情報メッセージ")
logger.warning("警告メッセージ")
環境変数のセキュリティベストプラクティス
環境変数を安全に使うためのポイントをまとめました。
1. 秘密情報の扱い方
import os
import logging
# ログに秘密情報を出力しない
api_key = os.getenv("API_KEY")
if api_key:
# マスク処理
masked_key = api_key[:4] + "*" * (len(api_key) - 8) + api_key[-4:]
logging.info(f"APIキーを読み込みました: {masked_key}")
2. 環境ごとの設定ファイル
# config.py
import os
class Config:
"""基本設定"""
SECRET_KEY = os.getenv("SECRET_KEY")
DATABASE_URL = os.getenv("DATABASE_URL")
class DevelopmentConfig(Config):
"""開発環境の設定"""
DEBUG = True
DATABASE_URL = os.getenv("DATABASE_URL", "sqlite:///dev.db")
class ProductionConfig(Config):
"""本番環境の設定"""
DEBUG = False
# 本番環境では必須
if not Config.SECRET_KEY:
raise ValueError("SECRET_KEYが設定されていません")
# 環境に応じて設定を選択
env = os.getenv("ENVIRONMENT", "development")
config = {
"development": DevelopmentConfig,
"production": ProductionConfig
}.get(env, DevelopmentConfig)()
3. 環境変数のバリデーション
import os
from typing import List, Dict
def validate_env_vars(required_vars: List[str]) -> Dict[str, str]:
"""必須の環境変数が設定されているか確認"""
env_vars = {}
missing_vars = []
for var in required_vars:
value = os.getenv(var)
if value:
env_vars[var] = value
else:
missing_vars.append(var)
if missing_vars:
raise ValueError(
f"以下の環境変数が設定されていません: {', '.join(missing_vars)}"
)
return env_vars
# 使用例
try:
env_vars = validate_env_vars([
"API_KEY",
"DATABASE_URL",
"SECRET_KEY"
])
print("すべての環境変数が正しく設定されています")
except ValueError as e:
print(f"エラー: {e}")
よくあるトラブルと解決方法
環境変数を使っていると遭遇しやすい問題と、その解決方法を紹介します。
環境変数が読み込まれない
import os
import sys
# デバッグ用:すべての環境変数を表示
def debug_env_vars():
print("=== 環境変数一覧 ===")
for key, value in os.environ.items():
# 秘密情報は部分的にマスク
if "KEY" in key or "PASSWORD" in key:
masked_value = value[:3] + "***" if len(value) > 3 else "***"
print(f"{key}: {masked_value}")
else:
print(f"{key}: {value}")
# 特定の環境変数が存在するか確認
if "MY_API_KEY" not in os.environ:
print("MY_API_KEYが設定されていません")
print("設定方法:")
if sys.platform == "win32":
print(" set MY_API_KEY=your-key")
else:
print(" export MY_API_KEY=your-key")
文字コードの問題(Windows)
import os
import locale
# Windowsで日本語を含む環境変数を扱う
if os.name == 'nt': # Windows
# システムのデフォルトエンコーディングを確認
print(f"システムエンコーディング: {locale.getpreferredencoding()}")
# 環境変数を適切にデコード
path = os.getenv("PATH")
if path:
# 必要に応じてエンコーディングを変換
try:
decoded_path = path.encode('cp932').decode('utf-8')
except:
decoded_path = path
まとめ
Pythonで環境変数を使う方法について、基礎から実践まで解説しました。
環境変数を使いこなすことで、以下のメリットが得られます。
- 秘密情報をコードから分離できる
- 環境ごとの設定切り替えが簡単
- チーム開発でも安全に設定を共有できる
まずは.env
ファイルとpython-dotenvを使った管理から始めてみてください。
慣れてきたら、環境ごとの設定クラスやバリデーション機能を追加して、より堅牢なアプリケーションを作っていきましょう。
環境変数は最初は面倒に感じるかもしれませんが、一度仕組みを作ってしまえば開発がとても楽になります。
ぜひ今回の内容を参考に、Pythonプロジェクトで環境変数を活用してみてください!
著者について

とまだ
フルスタックエンジニア
Learning Next の創設者。Ruby on Rails と React を中心に、プログラミング教育に情熱を注いでいます。初心者が楽しく学べる環境作りを目指しています。
著者の詳細を見る →