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を上げておきましょう。履歴が消えていた方も、元のファイルは残っている可能性があるので、あきらめずに探してみてください。
ここまでお読みいただきありがとうございました。