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
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:
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
^^^^^^^^^^^^^^^^^^^^^^
}
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) /
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",
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;
}
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);
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]);
/* 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;