Skip to content

Commit

Permalink
Issue python#27064: The py.exe launcher now defaults to Python 3.
Browse files Browse the repository at this point in the history
The Windows launcher ``py.exe`` no longer prefers an installed
Python 2 version over Python 3 by default when used interactively.
  • Loading branch information
pfmoore committed May 22, 2016
1 parent 7f3d16f commit 835416c
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 14 deletions.
22 changes: 15 additions & 7 deletions Doc/using/windows.rst
Original file line number Diff line number Diff line change
Expand Up @@ -418,6 +418,8 @@ Getting started
From the command-line
^^^^^^^^^^^^^^^^^^^^^

.. versionchanged:: 3.6

System-wide installations of Python 3.3 and later will put the launcher on your
:envvar:`PATH`. The launcher is compatible with all available versions of
Python, so it does not matter which version is installed. To check that the
Expand All @@ -427,25 +429,26 @@ launcher is available, execute the following command in Command Prompt:

py

You should find that the latest version of Python 2.x you have installed is
You should find that the latest version of Python you have installed is
started - it can be exited as normal, and any additional command-line
arguments specified will be sent directly to Python.

If you have multiple versions of Python 2.x installed (e.g., 2.6 and 2.7) you
will have noticed that Python 2.7 was started - to launch Python 2.6, try the
If you have multiple versions of Python installed (e.g., 2.7 and 3.6) you
will have noticed that Python 3.6 was started - to launch Python 2.7, try the
command:

::

py -2.6
py -2.7

If you have a Python 3.x installed, try the command:
If you want the latest version of Python 2.x you have installed, try the
command:

::

py -3
py -2

You should find the latest version of Python 3.x starts.
You should find the latest version of Python 2.x starts.

If you see the following error, you do not have the launcher installed:

Expand Down Expand Up @@ -500,6 +503,11 @@ version qualifier. Assuming you have Python 2.6 installed, try changing the
first line to ``#! python2.6`` and you should find the 2.6 version
information printed.

Note that unlike interactive use, a bare "python" will use the latest
version of Python 2.x that you have installed. This is for backward
compatibility and for compatibility with Unix, where the command ``python``
typically refers to Python 2.

From file associations
^^^^^^^^^^^^^^^^^^^^^^

Expand Down
9 changes: 9 additions & 0 deletions Doc/whatsnew/3.6.rst
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,17 @@ Summary -- Release highlights
.. This section singles out the most important changes in Python 3.6.
Brevity is key.
New syntax features:

* PEP 498: :ref:`Formatted string literals <whatsnew-fstrings>`

Windows improvements:

* The ``py.exe`` launcher, when used interactively, no longer prefers
Python 2 over Python 3 when the user doesn't specify a version (via
command line arguments or a config file). Handling of shebang lines
remains unchanged - "python" refers to Python 2 in that case.

.. PEP-sized items next.
.. _pep-4XX:
Expand Down
7 changes: 7 additions & 0 deletions Misc/NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,13 @@ Tests
- Issue #25285: Tools/buildbot/test.bat script now uses -j1 by default to run
each test file in fresh child process.

Windows
-------

- Issue #27064: The py.exe launcher now defaults to Python 3.
The Windows launcher ``py.exe`` no longer prefers an installed
Python 2 version over Python 3 by default when used interactively.


What's New in Python 3.6.0 alpha 1?
===================================
Expand Down
21 changes: 14 additions & 7 deletions PC/launcher.c
Original file line number Diff line number Diff line change
Expand Up @@ -465,7 +465,7 @@ get_configured_value(wchar_t * key)
}

static INSTALLED_PYTHON *
locate_python(wchar_t * wanted_ver)
locate_python(wchar_t * wanted_ver, BOOL from_shebang)
{
static wchar_t config_key [] = { L"pythonX" };
static wchar_t * last_char = &config_key[sizeof(config_key) /
Expand Down Expand Up @@ -497,10 +497,17 @@ locate_python(wchar_t * wanted_ver)
configured_value = get_configured_value(config_key);
if (configured_value)
result = find_python_by_version(configured_value);
/* Not found a value yet - try by major version.
* If we're looking for an interpreter specified in a shebang line,
* we want to try Python 2 first, then Python 3 (for Unix and backward
* compatibility). If we're being called interactively, assume the user
* wants the latest version available, so try Python 3 first, then
* Python 2.
*/
if (result == NULL)
result = find_python_by_version(L"2");
result = find_python_by_version(from_shebang ? L"2" : L"3");
if (result == NULL)
result = find_python_by_version(L"3");
result = find_python_by_version(from_shebang ? L"3" : L"2");
debug(L"search for default Python found ");
if (result) {
debug(L"version %ls at '%ls'\n",
Expand Down Expand Up @@ -1094,7 +1101,7 @@ find_by_magic(unsigned short magic)

for (mp = magic_values; mp->min; mp++) {
if ((magic >= mp->min) && (magic <= mp->max)) {
result = locate_python(mp->version);
result = locate_python(mp->version, FALSE);
if (result != NULL)
break;
}
Expand Down Expand Up @@ -1279,7 +1286,7 @@ specification: '%ls'.\nIn the first line of the script, 'python' needs to be \
followed by a valid version specifier.\nPlease check the documentation.",
command);
/* TODO could call validate_version(command) */
ip = locate_python(command);
ip = locate_python(command, TRUE);
if (ip == NULL) {
error(RC_NO_PYTHON, L"Requested Python version \
(%ls) is not installed", command);
Expand Down Expand Up @@ -1485,7 +1492,7 @@ process(int argc, wchar_t ** argv)
plen = wcslen(p);
valid = (*p == L'-') && validate_version(&p[1]);
if (valid) {
ip = locate_python(&p[1]);
ip = locate_python(&p[1], FALSE);
if (ip == NULL)
error(RC_NO_PYTHON, L"Requested Python version (%ls) not \
installed", &p[1]);
Expand All @@ -1512,7 +1519,7 @@ installed", &p[1]);

/* If we didn't find one, look for the default Python */
if (executable == NULL) {
ip = locate_python(L"");
ip = locate_python(L"", FALSE);
if (ip == NULL)
error(RC_NO_PYTHON, L"Can't find a default Python.");
executable = ip->executable;
Expand Down

0 comments on commit 835416c

Please sign in to comment.