<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Jupyter Blog - Matthias Bussonnier</title><link href="https://jasongrout.github.io/medium-archive/pelican/" rel="alternate"/><link href="https://jasongrout.github.io/medium-archive/pelican/feeds/author-matthias-bussonnier.atom.xml" rel="self"/><id>https://jasongrout.github.io/medium-archive/pelican/</id><updated>2017-05-31T22:47:00+00:00</updated><subtitle>The Project Jupyter blog: news, releases, and community stories, archived from blog.jupyter.org.</subtitle><entry><title>Release of IPython 5.4, 6.1, and rlipython.</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2017/release-of-ipython-5-4-6-1-and-rlipython-2/" rel="alternate"/><published>2017-05-31T22:47:00+00:00</published><updated>2017-05-31T22:47:00+00:00</updated><author><name>Matthias Bussonnier</name></author><id>tag:jasongrout.github.io,2017-05-31:/medium-archive/pelican/posts/2017/release-of-ipython-5-4-6-1-and-rlipython-2/</id><summary type="html">&lt;p&gt;Slightly over a month ago we released IPython 6.0 : the first version of IPython to be compatible only with Python 3. The reception of IPython 6.0 was great, and the codebase way more maintainable. So while 6.0 was mostly focused on internal refactoring and working upstream to&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Slightly over a month ago we &lt;a href="/posts/2017/release-of-ipython-6-0/"&gt;released IPython 6.0&lt;/a&gt; : the first version of IPython to be compatible only with Python 3. The reception of IPython 6.0 was great, and the codebase way more maintainable. So while 6.0 was mostly focused on internal refactoring and working upstream to make the release of a Python 3 only version possible, the next releases can focus on bug fixes and new features. Today we not only have the new release of IPython 6.1, but IPython 5.4 as well (the LTS branch targeting Python 2.7). Read on for more information! As usual, you can upgrade using pip and the 🔥 Conda Forge 🔥 builder is warming up: IPython 5.4, and 6.1 should be available via these channels soon.&lt;/p&gt;
&lt;h2 id="ipython-54-and-61-major-new-features"&gt;IPython 5.4 (and 6.1) major new features&lt;/h2&gt;
&lt;p&gt;IPython 5.x is the LTS branch which is still compatible with Python 2. The IPython team ♥️ Python 2 users so we continue to make fixes to our 5.x branch. You can install it today by making sure you have pip 9 or above:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;--version
pip&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;9&lt;/span&gt;.0.1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then upgrade IPython:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;ipython&lt;span class="w"&gt; &lt;/span&gt;--upgrade
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you do not have pip 9 and are using Python 2, pip may download IPython 6, which will not work on your system. If you are on Python 3, see the next section to upgrade to IPython 6.1 but read on in this section for the new features.&lt;/p&gt;
&lt;p&gt;IPython 5.4 got a number of new features that went into 6.0, plus a number of API improvements from 6.1 allowing the underlying library to target both 5.4+ (Python 2+3) and 6.1+ (Python 3) without having conditional branches. This should make the transition easier for users and developers&lt;/p&gt;
&lt;p&gt;You can see the what’s new for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://ipython.readthedocs.io/en/stable/whatsnew/version5.html"&gt;IPython 5.x&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ipython.readthedocs.io/en/stable/whatsnew/version6.html"&gt;IPython 6.x&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="terminalipythonappinteractive_shell_class"&gt;&lt;code&gt;TerminalIPythonApp.interactive_shell_class&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;In 6.0 and 5.4 IPython gained a new &lt;code&gt;c.TerminalIPythonApp.interactive_shell_class&lt;/code&gt; option, to customize the class used to start the terminal frontend. This should enable you to use custom interfaces, such as reviving the former readline interface which is now a separate package. See the next section for more.&lt;/p&gt;
&lt;h3 id="define-_repr_mimebundle_"&gt;Define &lt;code&gt;_repr_mimebundle_&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;In IPython 6.1+ and 5.4+ object can now define &lt;code&gt;_repr_mimebundle_&lt;/code&gt; in place of multiple &lt;code&gt;_repr_*_&lt;/code&gt; methods and return a dictionary of MIME types and MIME data for rich display. IPython provides &lt;code&gt;_ipython_display_&lt;/code&gt; but this mechanism was complex and difficult to use for frontends with different architectures, such as &lt;a href="https://nteract.io"&gt;nteract&lt;/a&gt; and &lt;a href="https://atom.io/packages/hydrogen"&gt;hydrogen&lt;/a&gt;. This new &lt;code&gt;_repr_mimebundlde_&lt;/code&gt; methods are thus simpler for both backend and frontends developers to implement, and are already handled in projects like &lt;a href="https://nteract.io"&gt;nteract&lt;/a&gt;. Our own &lt;a href="https://github.com/jupyterlab/jupyterlab"&gt;JupyterLab&lt;/a&gt;, the next-generation evolution of the Jupyter Notebook, takes full advantage of these capabilities to expose rich and flexible data display capabilities that work not only in notebook documents, but across all of JupyterLab.&lt;/p&gt;
&lt;p&gt;This new model will simplify things for client implementations and will facilitate the publication of custom mimetypes (GeoJson, Plotly, DataFrames, etc.). See the &lt;a href="http://nbviewer.jupyter.org/github/ipython/ipython/blob/6.x/examples/IPython%20Kernel/Custom%20Display%20Logic.ipynb"&gt;&lt;code&gt;Custom Display Logic&lt;/code&gt;&lt;/a&gt; example notebook for examples and technical details.&lt;/p&gt;
&lt;h3 id="execution-heuristics"&gt;Execution Heuristics&lt;/h3&gt;
&lt;p&gt;In IPython 5.4+ and 6.1 +, the heuristic for execution in the command line interface is now more biased toward executing for single statement. Use &lt;code&gt;Ctrl-O&lt;/code&gt; to force the insertion of a new line. The execution semantics of &lt;code&gt;Enter&lt;/code&gt; were still debated, so if you like to configure that you can define your own function which decides what to do.&lt;/p&gt;
&lt;h3 id="display-ids"&gt;Display IDs&lt;/h3&gt;
&lt;p&gt;IPython 5.4 and 6.1+ implement display ids, which can be used to update a displayed object. This should provide simple patterns to implement common cases of dynamic display updates (see &lt;a href="http://nbviewer.jupyter.org/github/ipython/ipython/blob/6.x/examples/IPython%20Kernel/Updating%20Displays.ipynb"&gt;&lt;code&gt;Updating Displays.ipynb&lt;/code&gt;&lt;/a&gt; notebook). It will also simplify the implementation of some types of interactive user interface elements, such as progress-bars. Display objects with IDs can be updated from other cells or frontends.&lt;/p&gt;
&lt;h3 id="the-display-function-is-now-always-available"&gt;The display function is now always available&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;display()&lt;/code&gt; function is now available by default in the IPython session, without users having to import anything. &lt;code&gt;display()&lt;/code&gt; is the &amp;quot;moral equivalent” of &lt;code&gt;print()&lt;/code&gt;, but takes advantage of the rich display capabilities of Jupyter (and defaults to printing a string for objects lacking rich representations). By making &lt;code&gt;display()&lt;/code&gt; appear, in practice, as if it was built-in, we hope to encourage library authors to provide their objects with rich and informative representations that users can now more conveniently access, whether at the IPython REPL or in any of the richer clients in the Jupyter ecosystem (JupyterLab, classic Notebook, nteract, etc.). Note that this automatic import of &lt;code&gt;display()&lt;/code&gt; is only done in the live IPython kernel; scripts and libraries that rely on display and may be run outside of IPython still need to import it using &lt;code&gt;from IPython.display import display&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="rlipython"&gt;Rlipython&lt;/h2&gt;
&lt;p&gt;Many users were pleased with the transition from readline to &lt;a href="http://ipython.readthedocs.io/en/stable/whatsnew/version5.html#ipython-5-0"&gt;&lt;code&gt;prompt_toolkit&lt;/code&gt; for IPython 5.0&lt;/a&gt;, this gave IPython multiline editing, nice completion and highlighting as you type. Still some users are missing the old readline interface (for its reactiveness an custom keybindings) though are still using IPython 4.x series.&lt;/p&gt;
&lt;p&gt;While prompt toolkit is still the default interface, you can now use the new configuration option &lt;code&gt;c.TerminalIPythonApp.interactive_shell_class&lt;/code&gt; .With this you can now replace the Prompt_Toolkit interface. For one of your liking.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://pypi.org/project/rlipython/"&gt;Rlipython&lt;/a&gt; is one of these alternative interface that resurect readline and is lighter, and more responsive on some system than default IPython. Using it still give you most of the new features of IPython 5.x or 6.x ! This should also please many of our users who use vi keybinding in terminals as this should respect &lt;code&gt;.inputrc&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;To try rlipython, install it with pip,&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;rlipython
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And follow the &lt;a href="https://pypi.org/project/rlipython/"&gt;instructions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We look forward to your contribution and please give lots of 💖 by to &lt;a href="https://twitter.com/ivanov/status/864918036628869124"&gt;@ivanov (tweet)&lt;/a&gt; for making this possible.&lt;/p&gt;
&lt;h2 id="ipython-61-and-python-3-only-features"&gt;IPython 6.1 and Python 3 only features&lt;/h2&gt;
&lt;p&gt;IPython 6.1 is the first minor release of our Python 3 only branch, it is the branch that get the most work, and start to use great new features such as type annotations, async/await [more to be added]. You can install it today please upgrade pip to pip 9 if you can, then upgrade IPython:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;ipython&lt;span class="w"&gt; &lt;/span&gt;--upgrade
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You’ll get &lt;strong&gt;all the new features in 5.4&lt;/strong&gt;, some of which are already in IPython 6.0, plus a number of additional enhancements:&lt;/p&gt;
&lt;p&gt;You can read more on the what’s new for IPython 6 &lt;a href="http://ipython.readthedocs.io/en/stable/whatsnew/version6.html"&gt;what’s new&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In this release, we had a number of bug fixes and improvements from developers at &lt;a href="https://www.twosigma.com/"&gt;TwoSigma&lt;/a&gt;, who participated in an internal open-source hackathon for Jupyter/IPython in May. Hackathon attendees tackled some long standing, hard to debug issues, and feature requests. Among these:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Quotes in a filename are always escaped during tab-completion on non-Windows, which should make many of our windows users happy. As none of the core devs use windows this one needed someone to simply use some elbow grease!&lt;/li&gt;
&lt;li&gt;Variables now shadow magics in autocompletion which make autocompletion of things like &lt;code&gt;matplotlib&lt;/code&gt; simpler and less surprising. - Magic aliases can now have parameters.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;??&lt;/code&gt; /&lt;code&gt;pinfo2&lt;/code&gt; machinery will show docstrings if source can’t be retrieved.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The completer also got a number of small improvements, and is smarter in many cases. For example, it understands the arguments to the &lt;code&gt;%config&lt;/code&gt; and &lt;code&gt;%colors&lt;/code&gt; magics. Long methods and &lt;code&gt;snake_case&lt;/code&gt; function names can now be completed from abbreviations. For example, if &lt;code&gt;foo_bar_kitten&lt;/code&gt; is an existing object, &lt;code&gt;f_b&amp;lt;tab&amp;gt;&lt;/code&gt; will find it as a possible completion.&lt;/p&gt;
&lt;p&gt;Look out for a blog post from TwoSigma.&lt;/p&gt;
&lt;p&gt;Only a small number of improvements are describe here, and we encourage you to read the full change logs if you want to know more.&lt;/p&gt;
&lt;p&gt;We hope that all these releases will make you more productive. We welcome your contributions, and questions. Feel free to open issues on GitHub, we’ll do our best to respond.&lt;/p&gt;
</content><category term="IPython"/><category term="releases"/></entry><entry><title>Release of IPython 6.0</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2017/release-of-ipython-6-0/" rel="alternate"/><published>2017-04-19T22:37:00+00:00</published><updated>2017-04-19T22:47:00+00:00</updated><author><name>Matthias Bussonnier</name></author><id>tag:jasongrout.github.io,2017-04-19:/medium-archive/pelican/posts/2017/release-of-ipython-6-0/</id><summary type="html">&lt;p&gt;It is with great pleasure that today we released IPython 6.0 — almost a year after the 5.0 version. Users on Python 3.3 and above can get this latest version with all its new features by asking your package manager to upgrade IPython. If you are using pip:&lt;/p&gt;
</summary><content type="html">&lt;p&gt;It is with great pleasure that today we released IPython 6.0 — almost a year after the 5.0 version.&lt;br&gt;
Users on Python 3.3 and above can get this latest version with all its &lt;a href="http://ipython.readthedocs.io/en/stable/whatsnew/version6.html"&gt;new features&lt;/a&gt; by asking your package manager to upgrade IPython. If you are using pip:&lt;/p&gt;
&lt;p&gt;Ensure you have pip 9+:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip --version
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;if not upgrade pip:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip install pip --upgrade
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then upgrade IPython.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip install ipython --upgrade
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;or if you have conda:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;conda update ipython
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It might take a few hours/days for the various conda channels to be updated.&lt;/p&gt;
&lt;p&gt;The &lt;a href="http://ipython.readthedocs.io/en/stable/whatsnew/version6.html"&gt;What’s New&lt;/a&gt; page has an extensive description of the changes, which includes new, modified and deprecated features.&lt;/p&gt;
&lt;h2 id="highlighted-feature-jedi-completion"&gt;Highlighted feature: Jedi completion&lt;/h2&gt;
&lt;p&gt;One of the biggest changes is integration with &lt;a href="https://jedi.readthedocs.io/en/stable/"&gt;Jedi&lt;/a&gt;, which provides completions using static analysis, and can display completion types. This will provide a foundation for a richer tab completion experience (e.g., it allows extracting and displaying function signatures in the completer). As of now, these features are available only for command line users, but work is underway in &lt;a href="https://github.com/ipython/ipykernel/pull/222"&gt;IPykernel&lt;/a&gt; and in various frontends (like &lt;a href="https://github.com/nteract/nteract/pull/1650"&gt;nteract&lt;/a&gt;) to make use of these features.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2017/release-of-ipython-6-0/images/001-jedi_type_inference_60.webp" alt="Jedi integration" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;h1 id="sunsetting-python-2-support"&gt;Sunsetting Python 2 support&lt;/h1&gt;
&lt;p&gt;As we &lt;a href="/posts/2016/release-of-ipython-5-0/"&gt;announced&lt;/a&gt; last year when we released IPython 5.0, IPython 6 and above require Python 3. The 5.x branch is still maintained and will be regularly released, so Python 2 users will still see updates, but new features in IPython 6.x will not be backported.&lt;/p&gt;
&lt;p&gt;We have worked to make installing IPython on Python 2 and 3 as seamless as possible, but you may still encounter errors. If you do, please check the [readme](&lt;a href="https://github.com/ipython/ipython/blob/master/README.rst#ipython-requires-python-version-3-or-above"&gt;https://github.com/ipython/ipython/blob/master/README.rst&lt;/a&gt; and if you still have a problem, &lt;a href="https://github.com/ipython/ipython/issues"&gt;open an issue&lt;/a&gt; on Github.&lt;/p&gt;
&lt;p&gt;If you want to hear more about the process of creating a seamless Python 2 sunset and are planning on attending PyCon 2017, we encourage you to attend our talk “&lt;a href="https://us.pycon.org/2017/schedule/presentation/319/"&gt;Ending Py2/Py3 compatibility in a user friendly manner&lt;/a&gt;” on Saturday, May 20, 2017 at 15:15–16:00 PDT.&lt;/p&gt;
&lt;h2 id="make-sure-you-have-pip-9-or-above"&gt;Make sure you have Pip 9 or above&lt;/h2&gt;
&lt;p&gt;For most end users the only thing you should pay attention is to have &lt;strong&gt;pip version 9, or above&lt;/strong&gt;. To check your pip version, run:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip --version
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you have a version of pip older than 9.0.1, you should upgrade pip to its latest version &lt;strong&gt;before&lt;/strong&gt; upgrading ipython ****:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip install pip --upgrade
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pip 9+ will install the latest compatible version of IPython – that is to say IPython 5.x if you are on Python 2, and IPython 6.x if you are on Python 3. Make sure this is the case for &lt;strong&gt;all your Python environments&lt;/strong&gt;, and build scripts. Users of &lt;strong&gt;Ubuntu Trusty 14.04 LTS&lt;/strong&gt; should be aware that the default pip is too old and will not install the correct version of IPython. Don’t forget to upgrade pip in your various install script, continuous integration settings and docker images.&lt;/p&gt;
&lt;h2 id="the-python-3-statement"&gt;The Python 3 statement&lt;/h2&gt;
&lt;p&gt;We care deeply about the seamless coexistence of Python 2 and Python 3 software. This is one of the reasons we started this transition with a new release that is only available for Python 3, while still maintaining the 5.x release series, which is compatible with Python 2. If you want to read more about these reasons you can find more information at the &lt;a href="http://www.python3statement.org"&gt;python 3 statement&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As expected, we discovered many challenges and pitfalls as we moved from a single source to a Python3-only source. In the course of overcoming these obstacles, we learned a great deal. We have documented the the risks and errors you can encounter (and their solutions) at the &lt;a href="http://www.python3statement.org/practicalities/"&gt;practicalities section&lt;/a&gt; of the python 3 statement.&lt;/p&gt;
&lt;p&gt;If you are a library maintainer planning to stop support for an older version of Python (even a minor version), and you want to limit the frustration faced by users who use your library on the older version of Python, we could use your help! If you want to add to the resources available for trouble-shooting this transition, please join the conversation on our &lt;a href="https://github.com/python3statement/python3statement.github.io"&gt;GitHub repository&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="migrating-to-python3-only-source"&gt;Migrating to Python3-only source&lt;/h2&gt;
&lt;p&gt;The migration of the IPython source code to be Python3-only was not an easy task, and was – as far as we can tell – unexplored territory. But we’ve bitten the bullet and hopefully anticipated most of the problems that can arise. With this, we hope to make the transition easier for other projects who want to follow our lead.&lt;/p&gt;
&lt;p&gt;First, let’s speak about our personal experience writing Python3-only source code.&lt;/p&gt;
&lt;p&gt;The size of the IPython codebase has decreased by about 1500 lines of Python code relative to the last release. Of course, that’s not &lt;em&gt;solely&lt;/em&gt; due to the removal of Python 2 support, but a non-negligible amount &lt;em&gt;is&lt;/em&gt;. And this reduction is even more remarkable in light of completely new features that required adding hundreds of lines of code. A large number of conditionals are gone, making the code more straightforward, easier to read, and simpler to maintain. Across the codebase we saw improvements in code compactness just from removing utility functions that existed only to provide identical behavior across Python 2 and Python 3. Even then, parts of the codebase remain affected by “Python 2 code”, so the potential gains are even greater. We will continue our quest to remove things as we go, and, as usual, contributions are welcome.&lt;/p&gt;
&lt;p&gt;This change eases the burden on contributors to IPython. Contributors can can spend less time thinking “what about Python 2”, or rewriting a pull request because the Python 2 test suite fails. At the same time, our tests now complete more quickly on continuous integration services because they need to run on fewer versions of Python.&lt;/p&gt;
&lt;p&gt;A couple of new APIs are using type annotations, Python3-only syntax which, properly used, make the code clearer and easier to refactor, and allow the documentation to focus on usage / reason than to describe the types of the function. We can also make use of nifty Python 3 features like keyword-only arguments, which is definitely appreciated when designing APIs.&lt;/p&gt;
&lt;p&gt;From a developer point of view we are extremely pleased with having the possibility to write Python3-only code, and are looking forward to even more improvements like &lt;a href="https://docs.python.org/3/library/pathlib.html"&gt;pathlib&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="keeping-a-python-2-stable-branch"&gt;Keeping a Python 2 stable branch&lt;/h2&gt;
&lt;p&gt;Keeping a Python 2 stable branch, and making the install experience as seamless as possible for Python 2 users was a key point in our decision to migrate to requiring Python 3. One of our first questions was how could we make sure that Python 2 users using &lt;code&gt;pip install&lt;/code&gt; would get the latest 5.x version of IPython still compatible with their system (and &lt;em&gt;not&lt;/em&gt; the latest &amp;gt;6.x version that would &lt;em&gt;not&lt;/em&gt; be compatible)? This lead us to a number of upstream patches (&lt;strong&gt;we’re giving a talk at PyCon, come see us&lt;/strong&gt;) and a number of guides as to how to make the transitions as a seamless as possible. We patched &lt;a href="https://github.com/pypa/pip/pull/3877"&gt;pip&lt;/a&gt;, &lt;a href="https://github.com/pypa/pypi-legacy/pull/506"&gt;pypi-legacy&lt;/a&gt;, &lt;a href="https://github.com/pypa/warehouse/pull/1448"&gt;warehouse&lt;/a&gt; (we had to learn postgres for that one), amended peps and made use of recent improvements in setuptools to allow Python users to peacefully coexist. The only thing the user should need to do is to make sure to use &lt;code&gt;pip 9+&lt;/code&gt; , and to use &lt;code&gt;pip install .&lt;/code&gt; and &lt;code&gt;pip install -e .&lt;/code&gt; instead of invoking &lt;code&gt;setup.py&lt;/code&gt; directly.&lt;/p&gt;
&lt;h2 id="migrating-more-code-to-python3-only"&gt;Migrating more code to Python3-only&lt;/h2&gt;
&lt;p&gt;IPython is the first of the Python packages we maintain which has been migrated from Python 2+3 compatibility to requiring Python 3. Some of our more recent projects (like JupyterHub) have required Python 3 from their beginnings. We expect more Jupyter &amp;amp; IPython projects will move to requiring Python 3 in the future.&lt;/p&gt;
&lt;p&gt;As the Jupyter protocol is language agnostic, it is perfectly possible to run Python 2 code in a Python 2 kernel using a Notebook Server running on Python 3. Especially since JupyterHub already requires Python 3, we envisage that the single-user notebook server will follow suit soon.&lt;/p&gt;
&lt;h1 id="conclusion"&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;We hope you will enjoy this release. It will be the base for some awesome features, like async/await REPL. We hope our work in the packaging ecosystem will minimise the inevitable teething difficulties from our first release to require Python 3. We look forward for your feedback.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://news.ycombinator.com/item?id=14152454"&gt;HN&lt;/a&gt; and &lt;a href="https://www.reddit.com/r/Python/comments/66dq42/ipython_60_released_stop_python_2_support/"&gt;reddit&lt;/a&gt;&lt;/p&gt;
</content><category term="IPython"/><category term="releases"/></entry></feed>