Changes in Jupyter Client


  • Add back block keyword argument to get_msg (PR #641)
  • Fix threaded client and fix qtconsole issues (PR #638)
  • Drop Python 3.5 and pin Python >= 3.6.1 (PR #636)
  • Use pre-commit for code style (PR #631)
  • Fix kernel client shutdown test (PR #629)
  • Add MultiKernelManager subclass tests (PR #627)
  • Add KernelManager subclass tests (PR #626)
  • Add type annotations, refactor sync/async (PR #623)


  • Yanked (PyPI) and marked as broken (conda)


  • Yanked (PyPI) and marked as broken (conda)


  • Shutdown request sequence has been modified to be more graceful, it now is preceded by interrupt, and will also send a SIGTERM before forcibly killing the kernel. (PR #620)
  • Removal of ipython_genutils as a dependency. It was implicit before; but required by at least traitlets thus avoiding issues. We are working on completely removing it from all jupyter dependencies; as it might lead to issues packaging for Python 3.10, and was mostly used for compatibility with python 2. (PR #620, PR #605)
  • Address a race condition between shutdown_kernel and restarter. (PR #607.)

See the full list of pull-requests


  • Move jedi pinning to test requirements (PR #599)


  • Add change parameter needed for observer method of kernel_spec_manager trait (PR #598)



  • Doc updates (PR #563, PR #564, PR #587)
  • Fix path to the connection file (PR #568)
  • Code cleanup (PR #574, PR #579)
  • Silence kill_kernel when no process is present (PR #576)
  • Remove extra_env and corresponding test (PR #581)
  • Add documentation dependencies to (PR #582)
  • Fix for Windows localhost IP addresses (PR #584)
  • Drop Travis CI, add GitHub Actions (PR #586)
  • Adapt KernelManager._kernel_spec_manager_changed to observe (PR #588)
  • Allow use ~/ in the kernel’s command or its arguments (PR #589)
  • Change wait_for_ready logic (PR #592)
  • Fix test_session with msgpack v1 (PR #594)


  • Removed warnings in more cases for KernelManagers that use new cleanup method (PR #560)
  • Some improved tests with a conversion to pytest pattern (PR #561)


  • Gracefully Close ZMQ Context upon kernel shutdown to fix memory leak (PR #548)
  • Fix for chained exceptions to preserve stacks (PR #552, PR #554)
  • Fix start_kernel error when passing kernel_id (PR #547)
  • Update to releasing docs (PR #543)


(Deleted release with incorrect local files)


  • Add AsyncKernelClient client_class to AsyncKernelManager (PR #542)
  • Doc fix for xeus hyperlinks (PR #540)
  • Doc typo fix (PR #539)


  • Fixed a bug causing clients to sometimes hang after a stop call was made (PR #536)


  • Subprocess kill action fix for async execution (PR #535)
  • Doc fix for xeus kernel list (PR #534)


This release includes support for asyncio patterns! Downstream tools should soon have releases to additionally support async patterns.

  • AsyncKernelManager and AsyncMultiKernelManager are now available for async jupyter_client interactions (PR #528, PR #529)
  • Removed unused sphinx dependency (PR #518, PR #518).
  • Added install instructions for pip to documentation (PR #521)
  • Improved docs around version protocol and messaging (PR #522, PR #526)


The git history had to be reworked heavily in merging 5.x and master, so a link to all the changes at once in github had been left out as it’s just confusing.

An exciting change in this release is some async support (huge thanks to @davidbrochart for doing most of the work)! See linked PR below for more details, we’re working on integrating this into nbclient as well in the near future.

New Features:


  • Python 3.8 testing and support added (PR #509)
  • Session.msg_id optimization (PR #493)
  • Only cache ports if the cache_ports flag is set to True (PR #492)
  • Removed direct dependency on pywin32 as this is now in jupyter core (PR #489)


  • Prevent two kernels to have the same ports (PR #490)


  • Document the handling of error in do_execute (PR #500)

Breaking changes:

  • Dropped support for Python 2.7!



  • Changed secure_write to be imported from jupyter_core with fix for extended usernames in Windows (PR #483).


  • Fixed issue with non-english windows permissions (PR #478). Potential issue still open in use with jupyerlab.


  • Important files creation now checks umask permissions (PR #469).


  • Fix bug with control channel socket introduced in 5.3.0 (PR #456).


5.3.0 on GitHub

New Features:


  • Control channel now in the public API (PR #447)
  • Closing Jupyter Client is now faster (PR #420)
  • Pip support improvements (PR #421)

Breaking changes:

  • Dropped support for Python 3.3 and 3.4 (upstream packages dropped support already)


5.2.4 on GitHub

  • Prevent creating new console windows on Windows (PR #346)
  • Fix interrupts on Python 3.7 on Windows (PR #408)


5.2.3 on GitHub

  • Fix hang on close in ThreadedKernelClient (used in QtConsole) when using tornado with asyncio (default behavior of tornado 5, see PR #352).
  • Fix errors when using deprecated KernelManager.kernel_cmd (PR #343, PR #344).


5.2.2 on GitHub


5.2.1 on GitHub

  • Add parenthesis to conditional pytest requirement to work around a bug in the wheel package, that generate a .whl which otherwise always depends on pytest see #324 and PR #325.


5.2 on GitHub

  • Define Jupyter protocol version 5.3:
  • New jupyter kernel command to launch an installed kernel by name (PR #240).
  • Kernelspecs where the command starts with e.g. python3 or python3.6—matching the version jupyter_client is running on—are now launched with the same Python executable as the launching process (PR #306). This extends the special handling of python added in 5.0.
  • Command line arguments specified by a kernelspec can now include {resource_dir}, which will be substituted with the kernelspec resource directory path when the kernel is launched (PR #289).
  • Kernelspecs now have an optional metadata field to hold arbitrary metadata about kernels—see Kernel specs (PR #274).
  • Make the KernelRestarter class used by a KernelManager configurable (PR #290).
  • When killing a kernel on Unix, kill its process group (PR #314).
  • If a kernel dies soon after starting, reassign random ports before restarting it, in case one of the previously chosen ports has been bound by another process (PR #279).
  • Avoid unnecessary filesystem operations when finding a kernelspec with KernelSpecManager.get_kernel_spec() (PR #311).
  • KernelSpecManager.get_all_specs() will no longer raise an exception on encountering an invalid kernel.json file. It will raise a warning and continue (PR #310).
  • Check for non-contiguous buffers before trying to send them through ZMQ (PR #258).
  • Compatibility with upcoming Tornado version 5.0 (PR #304).
  • Simplify setup code by always using setuptools (PR #284).
  • Soften warnings when setting the sticky bit on runtime files fails (PR #286).
  • Various corrections and improvements to documentation.


5.1 on GitHub

  • Define Jupyter protocol version 5.2, resolving ambiguity of cursor_pos field in the presence of unicode surrogate pairs.

  • Add Session.clone() for making a copy of a Session object without sharing the digest history. Reusing a single Session object to connect multiple sockets to the same IOPub peer can cause digest collisions.

  • Avoid global references preventing garbage collection of background threads.



5.0.1 on GitHub

  • Update internal protocol version number to 5.1, which should have been done in 5.0.0.


5.0.0 on GitHub

New features:

  • Implement Jupyter protocol version 5.1.

  • Introduce jupyter run command for running scripts with a kernel, for instance:

    jupyter run --kernel python3
  • New method BlockingKernelClient.execute_interactive() for running code and capturing or redisplaying its output.

  • New KernelManager.shutdown_wait_time configurable for adjusting the time for a kernel manager to wait after politely requesting shutdown before it resorts to forceful termination.


  • Set sticky bit on connection-file directory to avoid getting cleaned up.
  • jupyter_client.launcher.launch_kernel() passes through additional options to the underlying Popen, matching KernelManager.start_kernel().
  • Check types of buffers argument in Session.send(), so that TypeErrors are raised immediately, rather than in the eventloop.


  • In kernelspecs, if the executable is the string python (as opposed to an absolute path), sys.executable will be used rather than resolving python on PATH. This should enable Python-based kernels to install kernelspecs as part of wheels.
  • kernelspec names are now validated. They should only include ascii letters and numbers, plus period, hyphen, and underscore.

Backward-incompatible changes:

  • datetime objects returned in parsed messages are now always timezone-aware. Timestamps in messages without timezone info are interpreted as the local timezone, as this was the behavior in earlier versions.



4.4 on GitHub

  • Add KernelClient.load_connection_info() on KernelClient, etc. for loading connection info directly from a dict, not just from files.
  • Include parent headers when adapting messages from older protocol implementations (treats parent headers the same as headers).
  • Compatibility fixes in tests for recent changes in ipykernel.



4.3 on GitHub

  • Adds --sys-prefix argument to jupyter kernelspec install, for better symmetry with jupyter nbextension install, etc.



4.2.2 on GitHub

  • Another fix for the start_new_kernel() issue in 4.2.1 affecting slow-starting kernels.


4.2.1 on GitHub

  • Fix regression in 4.2 causing start_new_kernel() to fail while waiting for kernels to become available.


4.2.0 on GitHub

  • added jupyter kernelspec remove for removing kernelspecs
  • allow specifying the environment for kernel processes via the env argument
  • added name field to connection files identifying the kernelspec name, so that consumers of connection files (alternate frontends) can identify the kernelspec in use
  • added KernelSpecManager.get_all_specs() for getting all kernelspecs more efficiently
  • various improvements to error messages and documentation



4.1.0 on GitHub


  • Setuptools fixes for jupyter kernelspec
  • jupyter kernelspec list includes paths
  • add KernelManager.blocking_client()
  • provisional implementation of comm_info requests from upcoming 5.1 release of the protocol


The first release of Jupyter Client as its own package.