Update PEP 394: Distributions can choose what does python command mean

Hello. Based on discussions in [1], Petr Viktorin and me have drafted a new update [2] to the PEP 394 (The "python" Command on Unix-Like Systems). The update gives distributors the opportunity to decide where does the "python" command lead to, whether it is present etc. Please, see the PR [2] for the suggested changes. [1]: https://mail.python.org/pipermail/python-dev/2019-February/156272.html [2]: https://github.com/python/peps/pull/989 Thanks, -- Miro Hrončok -- Phone: +420777974800 IRC: mhroncok

On 4/12/19 4:53 PM, Miro Hrončok wrote:
Hello.
Based on discussions in [1], Petr Viktorin and me have drafted a new update [2] to the PEP 394 (The "python" Command on Unix-Like Systems).
The update gives distributors the opportunity to decide where does the "python" command lead to, whether it is present etc.
Please, see the PR [2] for the suggested changes.
[1]: https://mail.python.org/pipermail/python-dev/2019-February/156272.html [2]: https://github.com/python/peps/pull/989
The text is available at https://github.com/hroncok/peps/blob/pep394-2019/pep-0394.txt As a summary, I'll paste the rationale sections here: 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 entirely. This means either removing the ``python`` command or switching it to invoke Python 3, invalidating respectively the first or second recommendation. Also, some distributors decided that their users are better served by ignoring the PEP's recommendations, making the PEP's supposedly cross-platform recommendations on ``python`` and ``python2`` in shebangs increasingly unreliable. Current Rationale ================= As of 2019, nearly all new systems include Python 3 and the ``python3`` command. This makes the ``python3`` command the best general choice for code that can run on either Python 3.x or 2.x, even though it is not available everywhere. The recommendation is skewed toward current and future systems, leaving behind “*old systems*” (like RHEL 6 or default Python installed on macOS). On these systems, Python software is rarely updated and any recommendations this PEP makes would likely be ignored. Also, since distributors often ignored recommendations the PEP gave regarding the ``python`` command (for what they saw as legitimate special needs), this PEP now gives them broad control over the command. Correspondingly, users are advised to not use the ``python`` command in cross-platform code. Instead, this PEP specifies the expected behavior of the ``python3`` and ``python2`` commands, which is not controversial.

I think this is reasonable. Thanks for making the rationale clear! On Fri, Apr 12, 2019 at 8:02 AM Petr Viktorin <encukou@gmail.com> wrote:
On 4/12/19 4:53 PM, Miro Hrončok wrote:
Hello.
Based on discussions in [1], Petr Viktorin and me have drafted a new update [2] to the PEP 394 (The "python" Command on Unix-Like Systems).
The update gives distributors the opportunity to decide where does the "python" command lead to, whether it is present etc.
Please, see the PR [2] for the suggested changes.
[1]: https://mail.python.org/pipermail/python-dev/2019-February/156272.html [2]: https://github.com/python/peps/pull/989
The text is available at https://github.com/hroncok/peps/blob/pep394-2019/pep-0394.txt
As a summary, I'll paste the rationale sections here:
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 entirely. This means either removing the ``python`` command or switching it to invoke Python 3, invalidating respectively the first or second recommendation. Also, some distributors decided that their users are better served by ignoring the PEP's recommendations, making the PEP's supposedly cross-platform recommendations on ``python`` and ``python2`` in shebangs increasingly unreliable.
Current Rationale =================
As of 2019, nearly all new systems include Python 3 and the ``python3`` command. This makes the ``python3`` command the best general choice for code that can run on either Python 3.x or 2.x, even though it is not available everywhere.
The recommendation is skewed toward current and future systems, leaving behind “*old systems*” (like RHEL 6 or default Python installed on macOS). On these systems, Python software is rarely updated and any recommendations this PEP makes would likely be ignored.
Also, since distributors often ignored recommendations the PEP gave regarding the ``python`` command (for what they saw as legitimate special needs), this PEP now gives them broad control over the command. Correspondingly, users are advised to not use the ``python`` command in cross-platform code. Instead, this PEP specifies the expected behavior of the ``python3`` and ``python2`` commands, which is not controversial. _______________________________________________ Python-Dev mailing list Python-Dev@python.org https://mail.python.org/mailman/listinfo/python-dev Unsubscribe: https://mail.python.org/mailman/options/python-dev/guido%40python.org
-- --Guido van Rossum (python.org/~guido) *Pronouns: he/him/his **(why is my pronoun here?)* <http://feministing.com/2015/02/03/how-using-they-as-a-singular-pronoun-can-c...>

Thanks for the update. I have made one small suggestion on the PR for clarification, but otherwise the changes LGTM. -Barry
On Apr 12, 2019, at 07:53, Miro Hrončok <mhroncok@redhat.com> wrote:
Hello.
Based on discussions in [1], Petr Viktorin and me have drafted a new update [2] to the PEP 394 (The "python" Command on Unix-Like Systems).
The update gives distributors the opportunity to decide where does the "python" command lead to, whether it is present etc.
Please, see the PR [2] for the suggested changes.
[1]: https://mail.python.org/pipermail/python-dev/2019-February/156272.html [2]: https://github.com/python/peps/pull/989
Thanks, -- Miro Hrončok -- Phone: +420777974800 IRC: mhroncok _______________________________________________ Python-Dev mailing list Python-Dev@python.org https://mail.python.org/mailman/listinfo/python-dev Unsubscribe: https://mail.python.org/mailman/options/python-dev/barry%40python.org
participants (4)
-
Barry Warsaw
-
Guido van Rossum
-
Miro Hrončok
-
Petr Viktorin