summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_launcher.py18
-rw-r--r--Misc/NEWS.d/next/Windows/2022-07-26-20-33-12.gh-issue-95285.w6fa22.rst2
-rw-r--r--PC/launcher2.c3
3 files changed, 20 insertions, 3 deletions
diff --git a/Lib/test/test_launcher.py b/Lib/test/test_launcher.py
index 201aba6..0b7cbaa 100644
--- a/Lib/test/test_launcher.py
+++ b/Lib/test/test_launcher.py
@@ -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 @@ class RunPyMixin:
)
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 @@ class RunPyMixin:
"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 @@ class TestLauncher(unittest.TestCase, RunPyMixin):
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()
diff --git a/Misc/NEWS.d/next/Windows/2022-07-26-20-33-12.gh-issue-95285.w6fa22.rst b/Misc/NEWS.d/next/Windows/2022-07-26-20-33-12.gh-issue-95285.w6fa22.rst
new file mode 100644
index 0000000..76b38e7
--- /dev/null
+++ b/Misc/NEWS.d/next/Windows/2022-07-26-20-33-12.gh-issue-95285.w6fa22.rst
@@ -0,0 +1,2 @@
+Fix :ref:`launcher` handling of command lines where it is only passed a
+short executable name.
diff --git a/PC/launcher2.c b/PC/launcher2.c
index c8ed1b0..31b5617 100644
--- a/PC/launcher2.c
+++ b/PC/launcher2.c
@@ -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;