Join GitHub today
GitHub is home to over 50 million developers working together to host and review code, manage projects, and build software together.
Sign up| PEP: 394 | |
| Title: The "python" Command on Unix-Like Systems | |
| Version: $Revision$ | |
| Last-Modified: $Date$ | |
| Author: Kerrick Staley <mail@kerrickstaley.com>, | |
| Nick Coghlan <ncoghlan@gmail.com>, | |
| Barry Warsaw <barry@python.org>, | |
| Petr Viktorin <encukou@gmail.com>, | |
| Miro Hrončok <miro@hroncok.cz>, | |
| Carol Willing <willingc@gmail.com>, | |
| Status: Active | |
| Type: Informational | |
| Content-Type: text/x-rst | |
| Created: 02-Mar-2011 | |
| Post-History: 04-Mar-2011, 20-Jul-2011, 16-Feb-2012, 30-Sep-2014, 28-Apr-2018, | |
| 26-Jun-2019 | |
| Resolution: https://mail.python.org/pipermail/python-dev/2012-February/116594.html | |
| Abstract | |
| ======== | |
| This PEP outlines the behavior of Python scripts when the ``python`` command | |
| is invoked. | |
| Depending on a distribution or system configuration, | |
| ``python`` may or may not be installed. | |
| If ``python`` is installed its target interpreter may refer to ``python2`` | |
| or ``python3``. | |
| End users may be unaware of this inconsistency across Unix-like systems. | |
| This PEP's goal is to reduce user confusion about what ``python`` references | |
| and what will be the script's behavior. | |
| The recommendations in the next section of this PEP will outline the behavior | |
| when: | |
| * using virtual environments | |
| * writing cross-platform scripts with shebangs for either ``python2`` or ``python3`` | |
| The PEP's goal is to clarify the behavior for script end users, distribution | |
| providers, and script maintainers / authors. | |
| Recommendation | |
| ============== | |
| Our recommendations are detailed below. | |
| We call out any expectations that these recommendations are based upon. | |
| For Python runtime distributors | |
| ------------------------------- | |
| * We expect Unix-like software distributions (including systems like macOS and | |
| Cygwin) to install the ``python2`` command into the default path | |
| whenever a version of the Python 2 interpreter is installed, and the same | |
| for ``python3`` and the Python 3 interpreter. | |
| * When invoked, ``python2`` should run some version of the Python 2 | |
| interpreter, and ``python3`` should run some version of the Python 3 | |
| interpreter. | |
| * If the ``python`` command is installed, it is expected to invoke either | |
| the same version of Python as the ``python3`` command or as the ``python2`` | |
| command. | |
| * Distributors may choose to set the behavior of the ``python`` command | |
| as follows: | |
| * ``python2``, | |
| * ``python3``, | |
| * not provide ``python`` command, | |
| * allow ``python`` to be configurable by an end user or | |
| a system administrator. | |
| * The Python 3.x ``idle``, ``pydoc``, and ``python-config`` commands should | |
| likewise be available as ``idle3``, ``pydoc3``, and ``python3-config``; | |
| Python 2.x versions as ``idle2``, ``pydoc2``, and ``python2-config``. | |
| The commands with no version number should either invoke the same version | |
| of Python as the ``python`` command, or not be available at all. | |
| * When packaging third party Python scripts, distributors are encouraged to | |
| change less specific shebangs to more specific ones. | |
| This ensures software is used with the latest version of Python available, | |
| and it can remove a dependency on Python 2. | |
| The details on what specifics to set are left to the distributors; | |
| though. Example specifics could include: | |
| * Changing ``python`` shebangs to ``python3`` when Python 3.x is supported. | |
| * Changing ``python`` shebangs to ``python2`` when Python 3.x is not yet | |
| supported. | |
| * Changing ``python3`` shebangs to ``python3.8`` if the software is built | |
| with Python 3.8. | |
| * When a virtual environment (created by the PEP 405 ``venv`` package or a | |
| similar tool such as ``virtualenv`` or ``conda``) is active, the ``python`` | |
| command should refer to the virtual environment's interpreter and should | |
| always be available. | |
| The ``python3`` or ``python2`` command (according to the environment's | |
| interpreter version) should also be available. | |
| For Python script publishers | |
| ---------------------------- | |
| * When reinvoking the interpreter from a Python script, querying | |
| ``sys.executable`` to avoid hardcoded assumptions regarding the | |
| interpreter location remains the preferred approach. | |
| * Encourage your end users to use a virtual environment. | |
| This makes the user's environment more predictable (possibly resulting | |
| in fewer issues), and helps avoid disrupting their system. | |
| * For scripts that are only expected to be run in an activated virtual | |
| environment, shebang lines can be written as ``#!/usr/bin/env python``, | |
| as this instructs the script to respect the active virtual environment. | |
| * In cases where the script is expected to be executed outside virtual | |
| environments, developers will need to be aware of the following | |
| discrepancies across platforms and installation methods: | |
| * Older Linux distributions will provide a ``python`` command that | |
| refers to Python 2, and will likely not provide a ``python2`` command. | |
| * Some newer Linux distributions will provide a ``python`` command that | |
| refers to Python 3. | |
| * Some Linux distributions will not provide a ``python`` command at | |
| all by default, but will provide a ``python3`` command by default. | |
| * When potentially targeting these environments, developers may either | |
| use a Python package installation tool that rewrites shebang lines for | |
| the installed environment, provide instructions on updating shebang lines | |
| interactively, or else use more specific shebang lines that are | |
| tailored to the target environment. | |
| * Scripts targeting both “*old systems*” and systems without the default | |
| ``python`` command need to make a compromise and document this situation. | |
| Avoiding shebangs (via the console_scripts Entry Points ([9]_) or similar | |
| means) is the recommended workaround for this problem. | |
| * Applications designed exclusively for a specific environment (such as | |
| a container or virtual environment) may continue to use the ``python`` | |
| command name. | |
| For end users of Python | |
| ----------------------- | |
| * While far from being universally available, ``python`` remains the | |
| preferred spelling for explicitly invoking Python, as this is the | |
| spelling that virtual environments make consistently available | |
| across different platforms and Python installations. | |
| * For software that is not distributed with (or developed for) your system, | |
| we recommend using a virtual environment, possibly with an environment | |
| manager like ``conda`` or ``pipenv``, to help avoid disrupting your system | |
| Python installation. | |
| These recommendations are the outcome of the relevant python-dev discussions | |
| in March and July 2011 ([1]_, [2]_), February 2012 ([4]_), | |
| September 2014 ([6]_), discussion on GitHub in April 2018 ([7]_), | |
| on python-dev in February 2019 ([8]_), and during the PEP update review | |
| in May/June 2019 ([10]_). | |
| History of this PEP | |
| =================== | |
| In 2011, the majority of distributions | |
| aliased the ``python`` command to Python 2, but some started switching it to | |
| Python 3 ([5]_). As some of the former distributions did not provide a | |
| ``python2`` command by default, there was previously no way for Python 2 code | |
| (or any code that invokes the Python 2 interpreter directly rather than via | |
| ``sys.executable``) to reliably run on all Unix-like systems without | |
| modification, as the ``python`` command would invoke the wrong interpreter | |
| version on some systems, and the ``python2`` command would fail completely | |
| on others. This PEP originally provided a very simple mechanism | |
| to restore cross-platform support, with minimal additional work required | |
| on the part of distribution maintainers. Simplified, the recommendation was: | |
| 1. The ``python`` command was preferred for code compatible with both | |
| Python 2 and 3 (since it was available on all systems, even those that | |
| already aliased it to Python 3). | |
| 2. The ``python`` command should always invoke Python 2 (to prevent | |
| hard-to-diagnose errors when Python 2 code is run on Python 3). | |
| 3. The ``python2`` and ``python3`` commands should be available to specify | |
| the version explicitly. | |
| However, these recommendations implicitly assumed that Python 2 would always be | |
| available. As Python 2 is nearing its end of life in 2020 (PEP 373, PEP 404), | |
| distributions are making Python 2 optional or removing it entirely. | |
| This means either removing the ``python`` command or switching it to invoke | |
| Python 3. Some distributors also decided that their users were better served by | |
| ignoring the PEP's original recommendations, and provided system | |
| administrators with the freedom to configure their systems based on | |
| the needs of their particular environment. | |
| .. _rationale: | |
| Current Rationale | |
| ================= | |
| As of 2019, activating a Python virtual environment (or its functional | |
| equivalent) prior to script execution is one way to obtain a consistent | |
| cross-platform and cross-distribution experience. | |
| Accordingly, publishers can expect users of the software to provide a suitable | |
| execution environment. | |
| Future Changes to this Recommendation | |
| ===================================== | |
| This recommendation will be periodically reviewed over the next few years, | |
| and updated when the core development team judges it appropriate. As a | |
| point of reference, regular maintenance releases for the Python 2.7 series | |
| will continue until January 2020. | |
| Migration Notes | |
| =============== | |
| This section does not contain any official recommendations from the core | |
| CPython developers. It's merely a collection of notes regarding various | |
| aspects of migrating to Python 3 as the default version of Python for a | |
| system. They will hopefully be helpful to any distributions considering | |
| making such a change. | |
| * The main barrier to a distribution switching the ``python`` command from | |
| ``python2`` to ``python3`` isn't breakage within the distribution, but | |
| instead breakage of private third party scripts developed by sysadmins | |
| and other users. Updating the ``python`` command to invoke ``python3`` | |
| by default indicates that a distribution is willing to break such scripts | |
| with errors that are potentially quite confusing for users that aren't | |
| familiar with the backwards incompatible changes in Python 3. For | |
| example, while the change of ``print`` from a statement to a builtin | |
| function is relatively simple for automated converters to handle, the | |
| SyntaxError from attempting to use the Python 2 notation in Python 3 | |
| may be confusing for users that are not aware of the change:: | |
| $ python3 -c 'print "Hello, world!"' | |
| File "<string>", line 1 | |
| print "Hello, world!" | |
| ^ | |
| SyntaxError: Missing parentheses in call to 'print'. Did you mean print("Hello, world!")? | |
| While this might be obvious for experienced Pythonistas, such scripts | |
| might even be run by people who are not familiar with Python at all. | |
| Avoiding breakage of such third party scripts was the key reason this | |
| PEP used to recommend that ``python`` continue to refer to ``python2``. | |
| * The error message ``python: command not found`` tends to be surprisingly | |
| actionable, even for people unfamiliar with Python. | |
| * The ``pythonX.X`` (e.g. ``python3.6``) commands exist on modern systems, on | |
| which they invoke specific minor versions of the Python interpreter. It | |
| can be useful for distribution-specific packages to take advantage of these | |
| utilities if they exist, since it will prevent code breakage if the default | |
| minor version of a given major version is changed. However, scripts | |
| intending to be cross-platform should not rely on the presence of these | |
| utilities, but rather should be tested on several recent minor versions of | |
| the target major version, compensating, if necessary, for the small | |
| differences that exist between minor versions. This prevents the need for | |
| sysadmins to install many very similar versions of the interpreter. | |
| * When the ``pythonX.X`` binaries are provided by a distribution, the | |
| ``python2`` and ``python3`` commands should refer to one of those files | |
| rather than being provided as a separate binary file. | |
| * It is strongly encouraged that distribution-specific packages use ``python3`` | |
| (or ``python2``) rather than ``python``, even in code that is not intended to | |
| operate on other distributions. This will reduce problems if the | |
| distribution later decides to change the version of the Python interpreter | |
| that the ``python`` command invokes, or if a sysadmin installs a custom | |
| ``python`` command with a different major version than the distribution | |
| default. | |
| * If the above point is adhered to and sysadmins are permitted to change the | |
| ``python`` command, then the ``python`` command should always be implemented | |
| as a link to the interpreter binary (or a link to a link) and not vice | |
| versa. That way, if a sysadmin does decide to replace the installed | |
| ``python`` file, they can do so without inadvertently deleting the | |
| previously installed binary. | |
| * Even as the Python 2 interpreter becomes less common, it remains reasonable | |
| for scripts to continue to use the ``python3`` convention, rather than just | |
| ``python``. | |
| * If these conventions are adhered to, it will become the case that the | |
| ``python`` command is only executed in an interactive manner as a user | |
| convenience, or else when using a virtual environment or similar mechanism. | |
| Backwards Compatibility | |
| ======================= | |
| A potential problem can arise if a script adhering to the | |
| ``python2``/``python3`` convention is executed on a system not supporting | |
| these commands. This is mostly a non-issue, since the sysadmin can simply | |
| create these symbolic links and avoid further problems. It is a significantly | |
| more obvious breakage than the sometimes cryptic errors that can arise when | |
| attempting to execute a script containing Python 2 specific syntax with a | |
| Python 3 interpreter or vice versa. | |
| Application to the CPython Reference Interpreter | |
| ================================================ | |
| While technically a new feature, the ``make install`` and ``make bininstall`` | |
| command in the 2.7 version of CPython were adjusted to create the | |
| following chains of symbolic links in the relevant ``bin`` directory (the | |
| final item listed in the chain is the actual installed binary, preceding | |
| items are relative symbolic links):: | |
| python -> python2 -> python2.7 | |
| python-config -> python2-config -> python2.7-config | |
| Similar adjustments were made to the macOS binary installer. | |
| This feature first appeared in the default installation process in | |
| CPython 2.7.3. | |
| The installation commands in the CPython 3.x series already create the | |
| appropriate symlinks. For example, CPython 3.2 creates:: | |
| python3 -> python3.2 | |
| idle3 -> idle3.2 | |
| pydoc3 -> pydoc3.2 | |
| python3-config -> python3.2-config | |
| And CPython 3.3 creates:: | |
| python3 -> python3.3 | |
| idle3 -> idle3.3 | |
| pydoc3 -> pydoc3.3 | |
| python3-config -> python3.3-config | |
| pysetup3 -> pysetup3.3 | |
| The implementation progress of these features in the default installers was | |
| managed on the tracker as issue #12627 ([3]_). | |
| Impact on PYTHON* Environment Variables | |
| ======================================= | |
| The choice of target for the ``python`` command implicitly affects a | |
| distribution's expected interpretation of the various Python related | |
| environment variables. The use of ``*.pth`` files in the relevant | |
| ``site-packages`` folder, the "per-user site packages" feature (see | |
| ``python -m site``) or more flexible tools such as ``virtualenv`` are all more | |
| tolerant of the presence of multiple versions of Python on a system than the | |
| direct use of ``PYTHONPATH``. | |
| Exclusion of MS Windows | |
| ======================= | |
| This PEP deliberately excludes any proposals relating to Microsoft Windows, as | |
| devising an equivalent solution for Windows was deemed too complex to handle | |
| here. PEP 397 and the related discussion on the python-dev mailing list | |
| address this issue. | |
| References | |
| ========== | |
| .. [1] Support the /usr/bin/python2 symlink upstream (with bonus grammar class!) | |
| (https://mail.python.org/pipermail/python-dev/2011-March/108491.html) | |
| .. [2] Rebooting \PEP 394 (aka Support the /usr/bin/python2 symlink upstream) | |
| (https://mail.python.org/pipermail/python-dev/2011-July/112322.html) | |
| .. [3] Implement \PEP 394 in the CPython Makefile | |
| (http://bugs.python.org/issue12627) | |
| .. [4] \PEP 394 request for pronouncement (python2 symlink in \*nix systems) | |
| (https://mail.python.org/pipermail/python-dev/2012-February/116435.html) | |
| .. [5] Arch Linux announcement that their "python" link now refers Python 3 | |
| (https://www.archlinux.org/news/python-is-now-python-3/) | |
| .. [6] PEP 394 - Clarification of what "python" command should invoke | |
| (https://mail.python.org/pipermail/python-dev/2014-September/136374.html) | |
| .. [7] PEP 394: Allow the `python` command to not be installed, and other | |
| minor edits | |
| (https://github.com/python/peps/pull/630) | |
| .. [8] Another update for PEP 394 -- The "python" Command on Unix-Like Systems | |
| (https://mail.python.org/pipermail/python-dev/2019-February/156272.html) | |
| .. [9] The console_scripts Entry Point | |
| (https://python-packaging.readthedocs.io/en/latest/command-line-scripts.html#the-console-scripts-entry-point) | |
| .. [10] May 2019 PEP update review | |
| (https://github.com/python/peps/pull/989) | |
| Copyright | |
| =========== | |
| This document has been placed in the public domain. |