第1部 Python基礎編
第7章 モジュール・パッケージ・pip
すべてを自分で書く必要はありません。Pythonに標準で付いてくる豊富な部品と、世界中の開発者が公開している部品の安全な使い方を学びます。
🎯 この章で学ぶこと
importによるモジュールの利用- 実務で頻出の標準ライブラリ
- 仮想環境(venv)とpipによる外部パッケージ管理
- 外部パッケージに潜むサプライチェーンリスク
7.1 import — 部品を読み込む
Pythonの機能は「モジュール」という単位で整理されており、import で読み込んで使います。
import datetime
now = datetime.datetime.now()
print(now) # 2026-07-08 21:15:30.123456
print(now.strftime("%Y-%m-%d")) # 2026-07-08
# 特定の部品だけ読み込むこともできる
from datetime import date
print(date.today())
自分で書いたファイルもモジュールになります。前章の failed_report.py の関数を別のスクリプトから import failed_report して再利用できます。ファイル分割=部品化の単位です。
7.2 実務で頻出の標準ライブラリ
Pythonは「バッテリー同梱(batteries included)」と言われるほど標準ライブラリが充実しています。IT部門・セキュリティ用途での主役はこのあたりです。
| モジュール | 用途 | この教科書での登場 |
|---|---|---|
os / pathlib | ファイル・ディレクトリ操作、環境変数 | 第10章・第13章 |
csv / json | CSV・JSONの読み書き | 第6章・第13章 |
re | 正規表現(パターンによる文字列検索) | 第13章 |
hashlib | ハッシュ値の計算 | 第12章・第13章 |
secrets | 暗号学的に安全な乱数・トークン生成 | 第12章 |
ipaddress | IPアドレスの判定・計算 | 下の例 |
logging | ログ出力 | 第13章 |
datetime | 日付・時刻 | 各所 |
例として ipaddress を使うと、第5章の演習で書いた判定が正確・簡潔になります。
import ipaddress
ip = ipaddress.ip_address("192.168.1.5")
print(ip.is_private) # True
net = ipaddress.ip_network("10.0.0.0/24")
print(ipaddress.ip_address("10.0.0.77") in net) # True — 帯域内か判定
IPの判定、暗号、日付計算などを自作すると、専門家が長年テストしてきた標準ライブラリよりほぼ確実に欠陥が多くなります。特に暗号を自作しないこと(第12章)。「実績のある部品を正しく使う」がセキュアな開発の近道です。
7.3 仮想環境(venv)— プロジェクトごとの作業部屋
外部パッケージを入れる前に、仮想環境を作る習慣をつけましょう。仮想環境とは「プロジェクト専用のPython環境」で、パッケージの入れすぎによる衝突や環境汚染を防ぎます。
# プロジェクト用フォルダで実行
$ python -m venv .venv
# 有効化(Windows PowerShell)
$ .venv\Scripts\Activate.ps1
# 有効化(macOS / Linux)
$ source .venv/bin/activate
(.venv) $ # ← 先頭に (.venv) が付けば有効化されている
有効化した状態で入れたパッケージはこのフォルダの中だけに入り、deactivate で抜けられます。
7.4 pip — 外部パッケージの導入
pip はPython公式のパッケージ管理コマンドで、公開リポジトリ PyPI(パイ・ピー・アイ)からパッケージを取得します。HTTP通信で定番の requests を入れてみましょう。
(.venv) $ pip install requests
(.venv) $ pip list # 入っているパッケージ一覧
(.venv) $ pip freeze > requirements.txt # 一覧をファイルに記録
import requests
resp = requests.get("https://httpbin.org/get", timeout=10)
print(resp.status_code) # 200
print(resp.json()["url"]) # https://httpbin.org/get
requirements.txt に依存パッケージを記録しておけば、別のPCでも pip install -r requirements.txt で同じ環境を再現できます。
PyPIには誰でもパッケージを公開できます。これを悪用し、有名パッケージに似た名前の悪意あるパッケージ(例:requests に対する reqeusts)を仕込む攻撃をタイポスクワッティングと呼びます。インストールした瞬間に情報を盗むコードが動く実例が毎年報告されています。対策:
- パッケージ名を正確に確認してから
pip installする(スペルミスに注意) - 公式ドキュメントやPyPIのページで、開発元・ダウンロード数・更新履歴を確認する
- むやみに入れない。依存は最小限に(標準ライブラリで済むなら標準で)
- 会社の環境では、許可されたパッケージのみ使う運用ルールに従う
pip-auditなどのツールで既知の脆弱性を定期チェックする
7.5 スクリプトの「入口」— if __name__ == "__main__"
他人のPythonコードを読むと必ず出てくるおまじないがあります。
# port_util.py
def is_well_known(port):
"""ウェルノウンポート(0-1023)か判定する"""
return 0 <= port <= 1023
if __name__ == "__main__":
# このファイルを「直接実行」した時だけ動く
print(is_well_known(443)) # True
python port_util.py と直接実行すると下のブロックが動きますが、他のファイルから import port_util したときには動きません。「部品としても、単体のツールとしても使えるファイル」を作る定番の書き方です。
まとめ
importで標準ライブラリ・自作モジュール・外部パッケージを利用できる- まず標準ライブラリを探す。暗号やIP判定などは自作しない
- プロジェクトごとに
venvを作り、pipでパッケージ管理、requirements.txtで記録 - パッケージ導入は名前の確認・出所の確認・最小限の原則で。タイポスクワッティングに注意
if __name__ == "__main__":は「直接実行時だけ動く」入口
練習問題
datetime モジュールを使って、「今日から90日後の日付」を表示してください。ヒント:datetime.timedelta(days=90) を足し算できます。パスワードの有効期限計算などで使う実務パターンです。
解答を見る
from datetime import date, timedelta
expire = date.today() + timedelta(days=90)
print(f"有効期限: {expire}")
ipaddress モジュールを使い、リスト ["192.168.1.5", "8.8.8.8", "10.0.0.3", "203.0.113.7"] をプライベートIPとグローバルIPに分類して表示してください。
解答を見る
import ipaddress
ips = ["192.168.1.5", "8.8.8.8", "10.0.0.3", "203.0.113.7"]
for text in ips:
ip = ipaddress.ip_address(text)
kind = "プライベート" if ip.is_private else "グローバル"
print(f"{text}: {kind}")
"A" if 条件 else "B" は三項演算子と呼ばれる1行のif式です。
次のうち、セキュリティ上問題のある行動はどれでしょう(複数)。①勘で pip install requets と打つ ②標準ライブラリで済む処理のために外部パッケージを入れる ③pip freeze で依存を記録する ④社内サーバーに個人判断で未承認パッケージを入れる
解答を見る
①・②・④が問題です。
- ① スペルミスした名前のパッケージが悪意あるものかもしれません(タイポスクワッティング)。名前は必ず公式ドキュメントからコピーしましょう。
- ② 依存が増えるほど攻撃対象領域(アタックサーフェス)が広がります。必要最小限が原則です。
- ④ 会社の資産に対する変更は承認プロセスを通すべきです。シャドーITはインシデントの温床になります。
- ③は良い習慣です。環境の再現性が高まり、脆弱性監査もしやすくなります。