@@ -378,6 +378,29 @@ def test_custom_venv_install_scheme_is_prefered(mocker):
378
378
assert pyinfo .install_path ("purelib" ).replace (os .sep , "/" ) == f"lib/python{ pyver } /site-packages"
379
379
380
380
381
+ @pytest .mark .skipif (not (os .name == "posix" and sys .version_info [:2 ] >= (3 , 11 )), reason = "POSIX 3.11+ specific" )
382
+ def test_fallback_existent_system_executable (mocker ):
383
+ current = PythonInfo ()
384
+ # Posix may execute a "python" out of a venv but try to set the base_executable
385
+ # to "python" out of the system installation path. PEP 394 informs distributions
386
+ # that "python" is not required and the standard `make install` does not provide one
387
+
388
+ # Falsify some data to look like we're in a venv
389
+ current .prefix = current .exec_prefix = "/tmp/tmp.izZNCyINRj/venv"
390
+ current .executable = current .original_executable = os .path .join (current .prefix , "bin/python" )
391
+
392
+ # Since we don't know if the distribution we're on provides python, use a binary that should not exist
393
+ mocker .patch .object (sys , "_base_executable" , os .path .join (os .path .dirname (current .system_executable ), "idontexist" ))
394
+ mocker .patch .object (sys , "executable" , current .executable )
395
+
396
+ # ensure it falls back to an alternate binary name that exists
397
+ current ._fast_get_system_executable ()
398
+ assert os .path .basename (current .system_executable ) in [
399
+ f"python{ v } " for v in (current .version_info .major , f"{ current .version_info .major } .{ current .version_info .minor } " )
400
+ ]
401
+ assert os .path .exists (current .system_executable )
402
+
403
+
381
404
@pytest .mark .skipif (sys .version_info [:2 ] != (3 , 10 ), reason = "3.10 specific" )
382
405
def test_uses_posix_prefix_on_debian_3_10_without_venv (mocker ):
383
406
# this is taken from ubuntu 22.04 /usr/lib/python3.10/sysconfig.py
0 commit comments