diff --git a/scripts/tests/test-retrieval-server.py b/scripts/tests/test-retrieval-server.py index 8faf6c0..07618c6 100644 --- a/scripts/tests/test-retrieval-server.py +++ b/scripts/tests/test-retrieval-server.py @@ -117,6 +117,13 @@ class RetrievalServerTests(unittest.TestCase): self.assertEqual(MODULE.runtime_python(script, 'C:/Python/python.exe', 'nt'), runtime.resolve()) + def test_windows_runtime_handoff_keeps_multi_word_arguments(self): + calls = [] + with patch.object(MODULE, 'runtime_python', return_value=Path('C:/runtime/python.exe')), patch.object(MODULE.sys, 'argv', ['server.py', 'search', '--query', 'two words']), patch.object(MODULE.subprocess, 'run', side_effect=lambda command: calls.append(command) or SimpleNamespace(returncode=3)), self.assertRaises(SystemExit) as stopped: + MODULE.use_runtime_python('nt') + self.assertEqual(stopped.exception.code, 3) + self.assertEqual(calls[0][2:], ['search', '--query', 'two words']) + def test_preferred_device_uses_cuda_with_cpu_fallback(self): with patch.dict('sys.modules', torch=SimpleNamespace(cuda=SimpleNamespace(is_available=lambda: True))): self.assertEqual(MODULE.preferred_device(), 'cuda') diff --git a/shared/retrieval/server.py b/shared/retrieval/server.py index 9a8277d..cfa2abd 100644 --- a/shared/retrieval/server.py +++ b/shared/retrieval/server.py @@ -56,10 +56,14 @@ def runtime_python(script=__file__, executable=sys.executable, system=os.name): return None -def use_runtime_python(): +def use_runtime_python(system=os.name): runtime = runtime_python() if runtime is not None: - os.execv(str(runtime), [str(runtime), str(Path(__file__).resolve()), *sys.argv[1:]]) + command = [str(runtime), str(Path(__file__).resolve()), *sys.argv[1:]] + if system == 'nt': + # os.execv does not quote arguments on Windows, so a multi-word --query would be split. + sys.exit(subprocess.run(command).returncode) + os.execv(command[0], command) def sections(text: str, path: str):