Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PEP 394: Allow the python command to not be installed, and other minor edits #630

Merged
merged 4 commits into from Apr 28, 2018
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
65 changes: 50 additions & 15 deletions pep-0394.txt
Expand Up @@ -22,8 +22,9 @@ Python interpreter (i.e. the version invoked by the ``python`` command).

* ``python2`` will refer to some version of Python 2.x.
* ``python3`` will refer to some version of Python 3.x.
* for the time being, all distributions *should* ensure that ``python``
refers to the same target as ``python2``.
* for the time being, all distributions *should* ensure that ``python``,
if installed, refers to the same target as ``python2``, unless the system
administrator or user deliberately override this.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So this should probably change to ensuring that python, if it exists, runs Python 2 unless (a) the user explicitly overrides it, or (b) a venv is active.

* however, end users should be aware that ``python`` refers to ``python3``
on at least Arch Linux (that change is what prompted the creation of this
PEP), so ``python`` should be used in the shebang line only for scripts
Expand All @@ -43,11 +44,14 @@ Recommendation
* When invoked, ``python2`` should run some version of the Python 2
interpreter, and ``python3`` should run some version of the Python 3
interpreter.
* The more general ``python`` command should be installed whenever
any version of Python 2 is installed and should invoke the same version of
* If the ``python`` command is installed, it should invoke the same version of
Python as the ``python2`` command (however, note that some distributions
have already chosen to have ``python`` implement the ``python3``
command; see the `Rationale`_ and `Migration Notes`_ below).
command, and system administrators may be allowed to change the default;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't want sysadmins to feel empowered by this PEP, unless they are the only user of a system. Sysadmins often don't know what their users are doing. Changing what python does should be up to the user. The sysadmin should not have any dependencies on python -- sysadmin scripts should use python2 or python3.

see further recommendations and the `Rationale`_ and `Migration Notes`_
below).
* The ``python`` command should be available whenever ``python2`` is available,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess this should go.

except in controlled environments as discussed below.
* The Python 2.x ``idle``, ``pydoc``, and ``python-config`` commands should
likewise be available as ``idle2``, ``pydoc2``, and ``python2-config``,
with the original commands invoking these versions by default, but possibly
Expand All @@ -62,14 +66,35 @@ Recommendation
context.
* One exception to this is scripts that are deliberately written to be source
compatible with both Python 2.x and 3.x. Such scripts may continue to use
``python`` on their shebang line without affecting their portability.
``python`` on their shebang line.
* When packaging software that is source compatible with both versions,
distributions may change such ``python`` shebangs to ``python3`` (or
``python2``). This ensures software is used with the latest version of
Python available, and it can remove a dependency on Python 2.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(Then why the "or python2" ?)

* When reinvoking the interpreter from a Python script, querying
``sys.executable`` to avoid hardcoded assumptions regarding the
interpreter location remains the preferred approach.
* In controlled environments aimed at expert users, where being explicit
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes on this bullet.

is valued over user experience (for example, in test environments and
package build systems), distributions may choose to not provide the
``python`` command even if ``python2`` is available.
(All software in such a controlled environment must use ``python3`` or
``python2`` rather than ``python``, which means scripts that deliberately
use ``python`` need to be modified for such environments.)
* System administrators and users may be empowered to change the meaning of
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No on this bullet.

the ``python`` command to ``python3``. This should be a deliberate action
by the administrator. Related documentation should include a discussion
of the effects -- for example, a link to the "Migration Notes" section of
this PEP.
* When a virtual environment (created by the PEP 405 ``venv`` package or a
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes on this bullet.

similar tool) is active, the ``python`` command should refer to the
virtual environment's interpreter. In other words, activating a virtual
environment counts as deliberate user action to change the default
``python`` interpreter.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1 on this bullet point. Having python point to Python 3 when a Python 3 environment is activated is now established practice, and it would be nice for the PEP to acknowledge that. Many subparts of the community have already shifted away from the old idiom of relying on the system Python for user scripts.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, I won't ask venv to change, I just rm <env>/bin/python after creating the env. :-) I wonder if it should say "may refer" rather than "should refer"?

I do note that this makes using #!/usr/bin/env python quite unreliable to invoke Python 2.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd rather keep "should". It's quite an engrained expectation by now to have python point to the environment's Python. Doing otherwise would break those expectations.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aye, this is definitely a should - we rely on it heavily in the Python Packaging User Guide.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK.


These recommendations are the outcome of the relevant python-dev discussions
in March and July 2011 ([1]_, [2]_), February 2012 ([4]_) and
September 2014 ([6]_).
in March and July 2011 ([1]_, [2]_), February 2012 ([4]_),
September 2014 ([6]_), and April 2018 (XXX).
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Likely this discussion isn't going to be on python-dev but just in this PR.



Rationale
Expand All @@ -92,9 +117,9 @@ Future Changes to this Recommendation
=====================================

It is anticipated that there will eventually come a time where the third
party ecosystem surrounding Python 3 is sufficiently mature for this
recommendation to be updated to suggest that the ``python`` symlink
refer to ``python3`` rather than ``python2``.
party ecosystem surrounding Python 2 becomes irrelevant in most use cases,
at which point this recommendation should be updated to suggest that the
``python`` symlink refer to ``python3`` rather than ``python2``.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Honestly I would rather drop this paragraph -- it spreads false hope.


This recommendation will be periodically reviewed over the next few years,
and updated when the core development team judges it appropriate. As a
Expand Down Expand Up @@ -150,15 +175,15 @@ making such a change.
* 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 suggested that even distribution-specific packages follow the
``python2``/``python3`` convention, even in code that is not intended to
* It is suggested that distribution-specific packages use ``python2`` or
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd say "strongly encouraged" or something like that.

``python3`` 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. Distributions can test whether they are fully following this
convention by changing the ``python`` interpreter on a test box and checking
to see if anything breaks.
convention by changing or removing the ``python`` command on a test box
and checking to see if anything breaks.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps this fairly lame testing recommendation should just be deleted.

* 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
Expand Down Expand Up @@ -187,6 +212,16 @@ attempting to execute a script containing Python 2 specific syntax with a
Python 3 interpreter.


Forward Compatibility
=====================

A problem can arise if a script compatible with both Python 2 and 3, which
has ``python`` in its shebang line, is invoked on a system that does not have
Python 2 (and thus, the ``python`` command) installed.
This is mostly a non-issue -- as with any other case of a required interpreter
not being installed, the sysadmin can install the ``python`` command.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again, I don't want sysadmins to feel empowered by this. Assuming the shebang line uses #!/bin/env python this can be remedied by activating a venv.



Application to the CPython Reference Interpreter
================================================

Expand Down