Summary
When using the Python Launcher (py.exe) with a version flag (-V:X.Y), any script argument containing a forward slash (e.g. ./output, /tmp, C:/foo) causes exit code 103 ("No suitable Python runtime found"), even though the specified Python version is installed.
Reproduction
# test_simple.py
import sys
print('ran ok, argv:', sys.argv[1:])
py -V:3.14 test_simple.py files # OK
py -V:3.14 test_simple.py ./files # FAIL: "No suitable Python runtime found"
py -V:3.14 test_simple.py --help # OK (no slash)
py -V:3.14 test_simple.py .\files # OK (backslash is fine)
py -V:3.14 test_simple.py /files # FAIL
py -V:3.14 test_simple.py C:/files # FAIL
py test_simple.py ./files # OK (no -V: flag = unaffected)
Root cause
In PC/launcher2.c, parseCommandLine() parses -V:company/tag as follows:
const wchar_t *argStart = wcschr(arg, L':') + 1; // points past ':' in "-V:3.14"
const wchar_t *tagStart = wcschr(argStart, L'/'); // BUG: scans entire remaining cmdline
arg points into the full command-line string (from GetCommandLineW), not just the current token. tail (the whitespace-bounded end of the -V: token) is computed earlier but is not used to bound the wcschr search.
For py -V:3.14 script.py ./files, argStart is "3.14 script.py ./files...". The unbounded wcschr finds the / in ./files, and misparses:
company = "3.14 script.py ." (should be empty)
tag = "files" (should be "3.14")
selectEnvironment then finds no Python matching this bogus company/tag and returns RC_NO_PYTHON.
Fix
Limit the / search to within tail:
const wchar_t *argStart = wcschr(arg, L':') + 1;
// Search for '/' only within the current token boundary
const wchar_t *tagStart = NULL;
for (const wchar_t *p = argStart; p < tail; ++p) {
if (*p == L'/') { tagStart = p; break; }
}
Environment
- Python 3.14.4 (Windows 11, version 25H2)
py.exe version: 3.14.4 (C:\Windows\py.EXE)
- Also present in
launcher2.c on main and 3.13 branches (same code)
Summary
When using the Python Launcher (
py.exe) with a version flag (-V:X.Y), any script argument containing a forward slash (e.g../output,/tmp,C:/foo) causes exit code 103 ("No suitable Python runtime found"), even though the specified Python version is installed.Reproduction
Root cause
In
PC/launcher2.c,parseCommandLine()parses-V:company/tagas follows:argpoints into the full command-line string (fromGetCommandLineW), not just the current token.tail(the whitespace-bounded end of the-V:token) is computed earlier but is not used to bound thewcschrsearch.For
py -V:3.14 script.py ./files,argStartis"3.14 script.py ./files...". The unboundedwcschrfinds the/in./files, and misparses:selectEnvironmentthen finds no Python matching this bogus company/tag and returnsRC_NO_PYTHON.Fix
Limit the
/search to withintail:Environment
py.exeversion: 3.14.4 (C:\Windows\py.EXE)launcher2.conmainand3.13branches (same code)