python / python/cpython

`py -V:X.Y script.py` fails with "No suitable Python runtime found" when script arguments contain forward slashes

Offen Anfängerfreundlich
#148,478 2 Kommentare 1 Reaktion 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

3.13 3.14 3.15 interpreter-core OS-windows
Vorherrschende Sprache
Python
Sterne
77.2k
Forks
35.9k
PR-Merge-Kennzahlen
PR-Kennzahlen ausstehend

Beschreibung

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)

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne in PC/launcher2.c bei parseCommandLine(), reproduziere dann das Problem mit den aufgelisteten py -V:3.14-Befehlen und test_simple.py unter Windows. Erledigt ist die Aufgabe, wenn Skriptargumente mit Schrägstrichen bei Verwendung eines Versions-Flags nicht mehr „No suitable Python runtime found“ erzeugen und das vorhandene Company-/Tag-Parsing weiterhin funktioniert.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
c, python
Bereich
cli
Issue-Typ
Bug
Schwierigkeit
2/5
Geschätzter Aufwand
1-3 Stunden
Aktivitätsstatus
Ruhig
Klarheit
Klar beschrieben
Anfängerfreundlichkeit
72/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.