【2026年版】古いPythonから3.13・3.14へのバージョンアップ手順|3.10のサポート終了と削除されたモジュール
はじめに
この記事では、サポートの終わった古い Python(3.6〜3.10 など)で動いているプログラムを、3.13・3.14 に上げる手順をまとめました。
まず:Python 3.10 のサポートが終わった
2026 年 10 月 1 日、Python 3.10 の最後の更新(3.10.22)が出て、3.10 のサポートが終わりました。これからは、脆弱性が見つかっても 3.10 向けの修正は出ません。
この日の更新では、3.10〜3.14 の各バージョンで、次のような脆弱性が修正されました。
- 細工した tar ファイルを展開すると、展開先の外にファイルを書かれる(
tarfile) - 細工した ZIP ファイルで、メモリを使い果たさせられる(ZIP 爆弾)
- HTTPS 用のパスワードが、HTTP の通信で使われてしまうことがある(
urllib)
その前日の 9 月 30 日には、TLS のサーバーを外から落とせるおそれのある脆弱性(CVE-2026-19445、CVSS 9.2)も公表されました。影響するのは、SNI のコールバックで SSLContext を切り替えるサーバーだけですが、Python で TLS のサーバーを書いている場合は確かめましょう。
| バージョン | 状態(10 月 23 日時点) | サポートの期限 |
|---|---|---|
| 3.15 | 10 月 9 日に出たばかり | 2031 年 10 月 |
| 3.14 | バグ修正あり | 2030 年 10 月 |
| 3.13 | セキュリティ修正のみ | 2029 年 10 月 |
| 3.12 | セキュリティ修正のみ | 2028 年 10 月 |
| 3.11 | セキュリティ修正のみ | 2027 年 10 月 |
| 3.10 | 終了 | 2026 年 10 月 1 日に終了 |
| 3.9 以前 | 終了 | 3.9 は 2025 年 10 月に終了 |
今から上げるなら 3.13 か 3.14
今から上げるなら 3.13(2029 年 10 月まで)か 3.14(2030 年 10 月まで)がおすすめです。使っているライブラリ(特に NumPy・PyTorch など、C で書かれた部分を持つもの)が 3.14 に対応していれば 3.14、まだなら 3.13 にしましょう。3.15 は出たばかりなので、ライブラリの対応がそろうまで待つのが無難です。
バージョンアップの流れ
- Python のバージョンが決まっている場所を洗い出す:
.python-version・pyproject.tomlのrequires-python・Dockerfile・CI の設定 - 新しい Python で仮想環境を作り、依存パッケージを入れる
- テストを流し、非推奨の警告をエラーとして洗い出す
- コードを直す:削除されたモジュール、変わった動き
- CI・Docker・本番をそろえて切り替える
OS の Python は置き換えない
Linux では、OS の道具(dnf・yum など)が OS 付属の Python で動いています。OS の `/usr/bin/python3` を新しいものに置き換えると、OS が壊れることがあります。新しい Python は、uv・pyenv・Docker などで別に用意しましょう。
# uv を使う場合(Python 本体の取得から仮想環境まで)
uv python install 3.13
uv venv --python 3.13
source .venv/bin/activate
uv pip install -r requirements.txt
# pyenv を使う場合
pyenv install 3.13
pyenv local 3.13
python -m venv .venv依存パッケージを確かめる
Python のバージョンアップでいちばん止まりやすいのは、依存パッケージが新しい Python に対応していないことです。C で書かれた部分を持つパッケージは、新しい Python 用のビルド済みファイル(wheel)が無いと、インストールでビルドが始まって失敗します。
# 古いパッケージの一覧
pip list --outdated
# 新しい Python で、依存パッケージが入るか試す(ここで止まるものを先に上げる)
pip install -r requirements.txt非推奨の警告をエラーにして洗い出す
# 非推奨の警告をエラーとして扱ってテストを流す
python -W error::DeprecationWarning -m pytest今のバージョンで出ている非推奨の警告は、次のバージョンで削除されることが多いので、先に直しておくと楽になります。
古い書き方を自動で直す
ruff(リンター)の UP ルールや pyupgrade を使うと、古い書き方を新しいバージョン向けに自動で書き換えられます。
# ruff で、3.13 向けに書き換えられる箇所を直す
ruff check --select UP --target-version py313 --fix .
# pyupgrade を使う場合
pyupgrade --py313-plus $(git ls-files '*.py')つまずきやすいところ
3.10:collections の古い書き方が削除
# 3.9 まで動いていた書き方(3.10 で削除)
from collections import Mapping
# collections.abc から読み込む
from collections.abc import Mapping3.12:distutils・imp が削除
distutilsが削除された →setuptoolsか、sysconfig・shutilなどの標準の代わりにimpが削除された →importlibにasyncore・asynchat・smtpdが削除された →asyncioに- 仮想環境(venv)に
setuptoolsが最初から入らなくなった。必要なら自分で入れる - unittest の古い別名(
assertEqualsなど)が削除された →assertEqualに
3.13:古い標準モジュールがまとめて削除
使われなくなった標準モジュールが、まとめて削除されました。古い業務システムで使われていることがあるので、import を検索しましょう。
cgi・cgitb:CGI で動く古い Web アプリ。Web フレームワークか、email・urllib.parseで代わりを書くtelnetlib・nntplib・crypt・pipes・imghdrなどlib2to3(Python 2 から 3 への変換ツール 2to3)
3.14:動きが変わったもの
multiprocessingの既定の起動方法が、Linux でforkからforkserverに変わった。グローバル変数を子プロセスで使っているコードは要注意- イベントループが無いときの
asyncio.get_event_loop()がエラーになるようになった →asyncio.run()を使う
日付の扱い
3.12 から datetime.utcnow() が非推奨になりました。datetime.now(timezone.utc) のように、タイムゾーン付きで扱いましょう。
Python 2 がまだ残っている場合
Python 2.7 は 2020 年にサポートが終わっています。2 から 3 への変換ツール(2to3)も 3.13 で削除されたので、3 系への書き換えは、作り直しに近い作業として計画しましょう。
本番を切り替えるときの注意
- Docker のベースイメージは
python:3.13-slim-bookwormのように、バージョンと OS をはっきり書く - 依存パッケージのバージョンを固定する:
requirements.txtやuv.lockなどで、本番と手元をそろえる - cron やサービスの設定で、Python のパスを確かめる:古い Python を直接指定していることがある
- 切り戻しの手順を用意する
OS ごと古い場合(CentOS 7 の Python 3 は 3.6)は、OS の移行も合わせて考えましょう。CentOS 7 などサポートが終わった Linux からの移行にまとめています。
まとめ
- Python 3.10 は 2026 年 10 月 1 日にサポート終了。これからは修正が出ない
- 上げる先は 3.13 か 3.14(3.15 はライブラリの対応待ち)
- OS の Python は置き換えず、uv・pyenv・Docker で別に用意する
- 止まりやすいのは依存パッケージと、削除された標準モジュール(distutils・cgi など)
-W error::DeprecationWarningと ruff のUPルールで洗い出す
ほかの言語は、PHP 7 系から 8 系へ・古い Node.js から LTS へ・Java 11・17 から 21・25 へにまとめています。
参考
Python の公式の情報と、国内外のセキュリティ情報(2026 年 10 月 23 日時点)をもとにまとめています。
Status of Python versions - Python Developer's Guide



