Python WebAcademy Blog

IPython 9.18がリリース。Jupyterで入力の履歴が消えることがあった問題の修正と、JSONで配れるようになった色のテーマを初心者向けに解説

|

2026年10月30日、Jupyterの中でPythonを動かしている対話型シェルIPythonの9.18.0が公開されました。JupyterLab 4.6でノートブックを開き直したときに、入力の履歴が消えることがあった問題が直り、画面の色のテーマもJSONファイルを置くだけで追加できるようになっています。9.17.1と9.18.0で動かした結果とともに整理します。

2026年10月30日、Pythonの対話型シェルIPythonの9.18.0が公開されました。IPythonは、Jupyter NotebookやJupyterLabの中で、実際にPythonのコードを動かしている部分でもあります。

今回いちばん大事なのは、これまでに入力したコードの履歴が、消えてしまうことがあった問題の修正です。JupyterLab 4.6で、動いたままのカーネルにノートブックをつなぎ直すと起きることがあったそうです。

あわせて、画面の色のテーマを、JSONファイルを置くだけで追加できるようにもなりました。今回は、9.17.1と9.18.0で実際に動かしながら、何が変わったのかを見ていきます。

まずはIPythonとはどんなものか

最初に、IPythonを知らない方のために、どんなものなのかを簡単に紹介します。IPythonは、Pythonを1行ずつ打ち込んで試せる対話型シェルを、もっと便利にしたものです。

ターミナルでipythonと打つと起動し、色付きの表示や、Tabキーでの入力の補完、%で始まる便利なマジックコマンドなどが使えます。

JupyterとIPythonの関係

Jupyterでノートブックのセルを実行すると、その裏ではカーネルと呼ばれるプログラムがコードを動かしています。Pythonのカーネルとして標準的に使われているipykernelは、内部でIPythonを使っています。

部品 役割
JupyterLab、Jupyter Notebook ブラウザに表示される画面
ipykernel 画面からの指示を受けて、コードを動かすカーネル
IPython カーネルの中で、実際にコードを解釈して動かす部分

つまり、Jupyterでノートブックを使っている人は、意識しなくてもIPythonを使っていることになります。Jupyterそのものについては、こちらの記事も参考になります。【関連記事】Jupyter Notebook利用者が前年比92%増

9.18で何が変わったのかを整理しよう

続いて、9.18.0の主な変更を表にまとめます。内容は、IPythonの公式リポジトリにある変更点の記録、whatsnewのversion9.rstにもとづいています。

分類 主な変更
不具合の修正 ipykernelからの依頼で、入力の履歴がまるごと消えることがあった問題
新機能 色のテーマがJSONのデータになり、ファイルを置くだけで追加できる
新機能 表示の形式を登録するregister_formatter()を追加
補完の修正 辞書のキーの補完などで起きていた不具合を修正
表示の修正 WebP画像がPNGと間違えられていた問題などを修正

PyPIの記録によると、9.18.0が必要とするPythonは3.11以上です。ひとつ前の9.17.1は、2026年9月1日に公開されていました。

入力の履歴が消えることがあった

まずは、いちばん大事な修正から見ていきましょう。IPythonは、入力したコードの履歴を、history.sqliteという名前のSQLiteのデータベースに保存しています。

SQLiteは、ファイル1つで動く小さなデータベースです。Pythonから使う方法は、こちらで紹介しています。【関連記事】Pythonからデータベースを操作するsqlite3の使い方

なぜ消えてしまったのか

whatsnewによると、ipykernelは、履歴を取り出すget_tail()という関数を、件数を表す引数nにNoneを渡して呼んでいました。このNoneが、SQLiteにはLIMIT NULLという受け付けられない命令として届いていたそうです。

問題はその先です。IPythonは、このエラーをデータベースが壊れたと勘違いし、正常なhistory.sqliteを脇へ移して、空のデータベースを新しく作っていました。

whatsnewには、JupyterLab 4.6が、動いたままのカーネルにノートブックを開き直したときに、こうした依頼を送ると書かれています。つまり、つなぎ直しただけで、履歴が消えることがあったわけです。

9.17.1と9.18.0で再現してみた

実際に試してみましょう。新しい一時フォルダをIPythonの設定フォルダにして、3行の履歴を保存してから、get_tail()にn=Noneを渡します。

import os
import tempfile

os.environ["IPYTHONDIR"] = tempfile.mkdtemp()

from IPython.core.interactiveshell import InteractiveShell

shell = InteractiveShell.instance()
hm = shell.history_manager
for i, code in enumerate(["x = 1", "y = 2", "print(x + y)"], start=1):
    hm.store_inputs(i, code)
hm.writeout_cache()
hm.new_session()

db = os.path.join(os.environ["IPYTHONDIR"], "profile_default")
print("前:", sorted(os.listdir(db)))
print("get_tail:", [c for _, _, c in hm.get_tail(n=None, include_latest=True)])
print("後:", sorted(os.listdir(db)))

9.17.1と9.18.0を、それぞれ新しい仮想環境に入れ、手元のPython 3.11で実行した結果です。

IPython 9.17.1
前: ['history.sqlite', 'log', 'pid', 'security', 'startup']
get_tail: []
後: ['history-corrupt-2026-10-31T02.49.27.826084+00.00.sqlite', 'history.sqlite', ...]

IPython 9.18.0
前: ['history.sqlite', 'log', 'pid', 'security', 'startup']
get_tail: ['x = 1', 'y = 2', 'print(x + y)']
後: ['history.sqlite', 'log', 'pid', 'security', 'startup']

9.17.1では、履歴が1件も返ってこず、history-corruptという名前のファイルが新しくできていました。壊れていないのに、壊れたものとして脇へ移されたのです。

9.18.0では、3行の履歴がきちんと返ってきました。whatsnewによると、n=Noneは、既定の件数である10件として扱われるようになっています。

消えた履歴は取り戻せるのか

ここで少し安心できるのは、9.17.1でも、元のデータが削除されたわけではないことです。手元の結果でも、history-corruptで始まる名前のファイルとして、同じフォルダに残っていました。

JupyterLab 4.6を使っていて、最近履歴が消えたと感じていた方は、IPythonの設定フォルダを確かめてみてください。多くの場合、~/.ipython/profile_default/の中にあります。

色のテーマが、JSONファイルで追加できるように

続いて、新機能です。whatsnewによると、IPythonに同梱されている色のテーマが、Pythonのコードではなく、JSONのデータとして書かれるようになりました。

JSONファイルを置くだけで使える

その結果、IPythonの設定フォルダの中のthemesというフォルダにJSONファイルを置くだけで、新しいテーマを追加できるようになりました。ファイル名が、そのままテーマの名前になります。

同梱のテーマの書き方をまねて、入力を促す表示の色だけを変えたテーマを作ってみました。

{
  "name": "my-theme",
  "base": "monokai",
  "extra_style": {
    "Prompt": "ansibrightcyan",
    "PromptNum": "ansicyan bold"
  }
}

このファイルをthemes/my-theme.jsonとして置き、%colors my-themeで切り替えてみた結果を、表にまとめます。

版 %colors my-themeの結果 テーマの一覧にmy-themeがあるか
9.17.1 AssertionErrorで切り替えに失敗 False
9.18.0 問題なく切り替わった True

9.18.0では、コードを1行も書かずに、自分だけのテーマを使えるようになりました。JSONの書き方そのものについては、こちらで紹介しています。【関連記事】PythonでJSONデータの扱いをマスター

読み込む前に中身を確かめる

テーマが外から持ち込めるようになったので、読み込む前の確認も加わりました。whatsnewによると、テーマは読み込む前に検証され、問題があれば警告を出して読み込みを断ります。

たとえば、記号に使う文字は表示できる文字だけで20文字以内、という決まりがあります。テーマを使って、ターミナルを操作する特別な文字を送り込まれないようにするためだと説明されています。

変わった書き方に注意

whatsnewによると、テーマの一覧theme_tableは、中身を書き換えられない形に変わりました。名前で取り出したり、一覧を回したりする使い方は、これまでどおりです。

ただし、PyColorize.linux_themeのように、テーマを直接読み込む書き方は使えなくなりました。代わりに、theme_table["linux"]のように名前で取り出します。

そのほかの修正

補完や表示まわりにも、細かな修正がたくさん入っています。初心者にも関係しそうなものを、表にまとめます。

修正 中身
辞書のキーの補完 x if d[やk in d[のあとで、キーの補完が効かなかった
属性の補完 同じセルで先に定義した名前を、優先して補完するように
WebP画像 IPython.display.ImageでPNGと間違えられていたのを修正
FileLinks pathlib.Pathのようなパスのオブジェクトを受け付けるように
ProgressBar totalが0のとき、ZeroDivisionErrorになっていたのを修正
アンダースコア _や__を削除したあとも、直前の結果が入るように

pathlibでのパスの扱い方は、こちらで紹介しています。【関連記事】Pythonのpathlibとは?

上げる方法と、確かめたいこと

最後に、IPythonを9.18.0へ上げる方法と、確かめておきたいことを整理します。

順番 確認すること
1 Jupyterのカーネルを動かしている環境で、IPythonを上げる
2 上げたあと、カーネルを再起動する
3 履歴が消えていた場合は、history-corruptで始まるファイルを探す
4 PyColorizeからテーマを直接読み込むコードがないか確かめる

大事なのは、ブラウザの画面ではなく、カーネルを動かしている環境のIPythonを上げることです。pip install --upgrade ipythonを、カーネルが使っている仮想環境で実行してください。

私は10年ほどエンジニアとして開発に関わってきましたが、分析の途中で試したコードを、IPythonの履歴から何度も掘り起こして助けられてきました。それだけに、履歴が静かに消えてしまう不具合は、気づいたときの痛手が大きい種類の問題だと感じます。

まとめ

2026年10月30日、IPython 9.18.0が公開されました。JupyterLab 4.6でノートブックを開き直したときに、入力の履歴が消えることがあった問題が直り、色のテーマもJSONファイルを置くだけで追加できるようになっています。

Jupyterを使っている方は、カーネルの環境でIPythonを上げておきましょう。履歴が消えていた方も、元のファイルは残っている可能性があるので、あきらめずに探してみてください。

ここまでお読みいただきありがとうございました。

参考情報

次のアクション

記事で学んだ内容を実際に動かしてみよう

Python WebAcademyでは、ブラウザ上でコードを書きながら基礎から実践まで体系的に学べます。

Python WebAcademyの学習画面

あわせて読む

関連記事

ブログ一覧へ

Python学習ロードマップ

まずはこの3講座から

記事で気になったテーマを、順番に手を動かしながら学べます。

ロードマップを見る