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.
This commit is contained in:
parent
7f3d16f8f5
commit
835416cf7c
|
@ -418,6 +418,8 @@ Getting started
|
||||||
From the command-line
|
From the command-line
|
||||||
^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. versionchanged:: 3.6
|
||||||
|
|
||||||
System-wide installations of Python 3.3 and later will put the launcher on your
|
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
|
: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
|
Python, so it does not matter which version is installed. To check that the
|
||||||
|
@ -427,25 +429,26 @@ launcher is available, execute the following command in Command Prompt:
|
||||||
|
|
||||||
py
|
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
|
started - it can be exited as normal, and any additional command-line
|
||||||
arguments specified will be sent directly to Python.
|
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
|
If you have multiple versions of Python installed (e.g., 2.7 and 3.6) you
|
||||||
will have noticed that Python 2.7 was started - to launch Python 2.6, try the
|
will have noticed that Python 3.6 was started - to launch Python 2.7, try the
|
||||||
command:
|
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:
|
If you see the following error, you do not have the launcher installed:
|
||||||
|
|
||||||
|
@ -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
|
first line to ``#! python2.6`` and you should find the 2.6 version
|
||||||
information printed.
|
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
|
From file associations
|
||||||
^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
|
|
@ -62,8 +62,17 @@ Summary -- Release highlights
|
||||||
.. This section singles out the most important changes in Python 3.6.
|
.. This section singles out the most important changes in Python 3.6.
|
||||||
Brevity is key.
|
Brevity is key.
|
||||||
|
|
||||||
|
New syntax features:
|
||||||
|
|
||||||
* PEP 498: :ref:`Formatted string literals <whatsnew-fstrings>`
|
* 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-sized items next.
|
||||||
|
|
||||||
.. _pep-4XX:
|
.. _pep-4XX:
|
||||||
|
|
|
@ -32,6 +32,13 @@ Tests
|
||||||
- Issue #25285: Tools/buildbot/test.bat script now uses -j1 by default to run
|
- Issue #25285: Tools/buildbot/test.bat script now uses -j1 by default to run
|
||||||
each test file in fresh child process.
|
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?
|
What's New in Python 3.6.0 alpha 1?
|
||||||
===================================
|
===================================
|
||||||
|
|
|
@ -465,7 +465,7 @@ get_configured_value(wchar_t * key)
|
||||||
}
|
}
|
||||||
|
|
||||||
static INSTALLED_PYTHON *
|
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 config_key [] = { L"pythonX" };
|
||||||
static wchar_t * last_char = &config_key[sizeof(config_key) /
|
static wchar_t * last_char = &config_key[sizeof(config_key) /
|
||||||
|
@ -497,10 +497,17 @@ locate_python(wchar_t * wanted_ver)
|
||||||
configured_value = get_configured_value(config_key);
|
configured_value = get_configured_value(config_key);
|
||||||
if (configured_value)
|
if (configured_value)
|
||||||
result = find_python_by_version(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)
|
if (result == NULL)
|
||||||
result = find_python_by_version(L"2");
|
result = find_python_by_version(from_shebang ? L"2" : L"3");
|
||||||
if (result == NULL)
|
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 ");
|
debug(L"search for default Python found ");
|
||||||
if (result) {
|
if (result) {
|
||||||
debug(L"version %ls at '%ls'\n",
|
debug(L"version %ls at '%ls'\n",
|
||||||
|
@ -1094,7 +1101,7 @@ find_by_magic(unsigned short magic)
|
||||||
|
|
||||||
for (mp = magic_values; mp->min; mp++) {
|
for (mp = magic_values; mp->min; mp++) {
|
||||||
if ((magic >= mp->min) && (magic <= mp->max)) {
|
if ((magic >= mp->min) && (magic <= mp->max)) {
|
||||||
result = locate_python(mp->version);
|
result = locate_python(mp->version, FALSE);
|
||||||
if (result != NULL)
|
if (result != NULL)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -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.",
|
followed by a valid version specifier.\nPlease check the documentation.",
|
||||||
command);
|
command);
|
||||||
/* TODO could call validate_version(command) */
|
/* TODO could call validate_version(command) */
|
||||||
ip = locate_python(command);
|
ip = locate_python(command, TRUE);
|
||||||
if (ip == NULL) {
|
if (ip == NULL) {
|
||||||
error(RC_NO_PYTHON, L"Requested Python version \
|
error(RC_NO_PYTHON, L"Requested Python version \
|
||||||
(%ls) is not installed", command);
|
(%ls) is not installed", command);
|
||||||
|
@ -1485,7 +1492,7 @@ process(int argc, wchar_t ** argv)
|
||||||
plen = wcslen(p);
|
plen = wcslen(p);
|
||||||
valid = (*p == L'-') && validate_version(&p[1]);
|
valid = (*p == L'-') && validate_version(&p[1]);
|
||||||
if (valid) {
|
if (valid) {
|
||||||
ip = locate_python(&p[1]);
|
ip = locate_python(&p[1], FALSE);
|
||||||
if (ip == NULL)
|
if (ip == NULL)
|
||||||
error(RC_NO_PYTHON, L"Requested Python version (%ls) not \
|
error(RC_NO_PYTHON, L"Requested Python version (%ls) not \
|
||||||
installed", &p[1]);
|
installed", &p[1]);
|
||||||
|
@ -1512,7 +1519,7 @@ installed", &p[1]);
|
||||||
|
|
||||||
/* If we didn't find one, look for the default Python */
|
/* If we didn't find one, look for the default Python */
|
||||||
if (executable == NULL) {
|
if (executable == NULL) {
|
||||||
ip = locate_python(L"");
|
ip = locate_python(L"", FALSE);
|
||||||
if (ip == NULL)
|
if (ip == NULL)
|
||||||
error(RC_NO_PYTHON, L"Can't find a default Python.");
|
error(RC_NO_PYTHON, L"Can't find a default Python.");
|
||||||
executable = ip->executable;
|
executable = ip->executable;
|
||||||
|
|
Loading…
Reference in New Issue