gh-95285: py.exe launcher fails with short argv0 (GH-95295) (GH-95298)

(cherry picked from commit 7ac5bb3e6a)

Co-authored-by: Steve Dower <steve.dower@python.org>
This commit is contained in:
Miss Islington (bot) 2022-07-27 01:06:59 -07:00 committed by GitHub
parent 0d812a58a7
commit 7df3a1ce4b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 20 additions and 3 deletions

View File

@ -150,7 +150,7 @@ class RunPyMixin:
@classmethod
def find_py(cls):
py_exe = None
if sysconfig.is_python_build(True):
if sysconfig.is_python_build():
py_exe = Path(sys.executable).parent / PY_EXE
else:
for p in os.getenv("PATH").split(";"):
@ -188,7 +188,7 @@ def find_py(cls):
)
return py_exe
def run_py(self, args, env=None, allow_fail=False, expect_returncode=0):
def run_py(self, args, env=None, allow_fail=False, expect_returncode=0, argv=None):
if not self.py_exe:
self.py_exe = self.find_py()
@ -199,9 +199,12 @@ def run_py(self, args, env=None, allow_fail=False, expect_returncode=0):
"PYLAUNCHER_DEBUG": "1",
"PYLAUNCHER_DRYRUN": "1",
}
if not argv:
argv = [self.py_exe, *args]
with subprocess.Popen(
[self.py_exe, *args],
argv,
env=env,
executable=self.py_exe,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
@ -540,6 +543,15 @@ def test_py3_shebang_nl(self):
self.assertEqual("3.100-arm64", data["SearchInfo.tag"])
self.assertEqual(f"X.Y-arm64.exe -X fake_arg_for_test -prearg {script} -postarg", data["stdout"].strip())
def test_py_shebang_short_argv0(self):
with self.py_ini(TEST_PY_COMMANDS):
with self.script("#! /usr/bin/env python -prearg") as script:
# Override argv to only pass "py.exe" as the command
data = self.run_py([script, "-postarg"], argv=f'"py.exe" "{script}" -postarg')
self.assertEqual("PythonTestSuite", data["SearchInfo.company"])
self.assertEqual("3.100", data["SearchInfo.tag"])
self.assertEqual(f'X.Y.exe -prearg "{script}" -postarg', data["stdout"].strip())
def test_install(self):
data = self.run_py(["-V:3.10"], env={"PYLAUNCHER_ALWAYS_INSTALL": "1"}, expect_returncode=111)
cmd = data["stdout"].strip()

View File

@ -0,0 +1,2 @@
Fix :ref:`launcher` handling of command lines where it is only passed a
short executable name.

View File

@ -580,6 +580,9 @@ parseCommandLine(SearchInfo *search)
break;
}
}
if (tail == search->originalCmdLine && tail[0] == L'"') {
++tail;
}
// Without special cases, we can now fill in the search struct
int tailLen = (int)(end ? (end - tail) : wcsnlen_s(tail, MAXLEN));
search->executableLength = -1;