mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	bpo-46028: Calculate base_executable by resolving symlinks in a venv (GH-30144)
This commit is contained in:
		
							parent
							
								
									32398294fb
								
							
						
					
					
						commit
						7407fe4c25
					
				
					 3 changed files with 47 additions and 1 deletions
				
			
		|  | @ -328,6 +328,38 @@ def test_venv_posix(self): | |||
|         actual = getpath(ns, expected) | ||||
|         self.assertEqual(expected, actual) | ||||
| 
 | ||||
|     def test_venv_changed_name_posix(self): | ||||
|         "Test a venv layout on *nix." | ||||
|         ns = MockPosixNamespace( | ||||
|             argv0="python", | ||||
|             PREFIX="/usr", | ||||
|             ENV_PATH="/venv/bin:/usr/bin", | ||||
|         ) | ||||
|         ns.add_known_xfile("/usr/bin/python3") | ||||
|         ns.add_known_xfile("/venv/bin/python") | ||||
|         ns.add_known_link("/venv/bin/python", "/usr/bin/python3") | ||||
|         ns.add_known_file("/usr/lib/python9.8/os.py") | ||||
|         ns.add_known_dir("/usr/lib/python9.8/lib-dynload") | ||||
|         ns.add_known_file("/venv/pyvenv.cfg", [ | ||||
|             r"home = /usr/bin" | ||||
|         ]) | ||||
|         expected = dict( | ||||
|             executable="/venv/bin/python", | ||||
|             prefix="/usr", | ||||
|             exec_prefix="/usr", | ||||
|             base_executable="/usr/bin/python3", | ||||
|             base_prefix="/usr", | ||||
|             base_exec_prefix="/usr", | ||||
|             module_search_paths_set=1, | ||||
|             module_search_paths=[ | ||||
|                 "/usr/lib/python98.zip", | ||||
|                 "/usr/lib/python9.8", | ||||
|                 "/usr/lib/python9.8/lib-dynload", | ||||
|             ], | ||||
|         ) | ||||
|         actual = getpath(ns, expected) | ||||
|         self.assertEqual(expected, actual) | ||||
| 
 | ||||
|     def test_symlink_normal_posix(self): | ||||
|         "Test a 'standard' install layout via symlink on *nix" | ||||
|         ns = MockPosixNamespace( | ||||
|  |  | |||
|  | @ -0,0 +1,3 @@ | |||
| Fixes calculation of :data:`sys._base_executable` when inside a virtual | ||||
| environment that uses symlinks with different binary names than the base | ||||
| environment provides. | ||||
|  | @ -351,6 +351,17 @@ def search_up(prefix, *landmarks, test=isfile): | |||
|         key, had_equ, value = line.partition('=') | ||||
|         if had_equ and key.strip().lower() == 'home': | ||||
|             executable_dir = real_executable_dir = value.strip() | ||||
|             if not base_executable: | ||||
|                 # First try to resolve symlinked executables, since that may be | ||||
|                 # more accurate than assuming the executable in 'home'. | ||||
|                 try: | ||||
|                     base_executable = realpath(executable) | ||||
|                     if base_executable == executable: | ||||
|                         # No change, so probably not a link. Clear it and fall back | ||||
|                         base_executable = '' | ||||
|                 except OSError: | ||||
|                     pass | ||||
|                 if not base_executable: | ||||
|                     base_executable = joinpath(executable_dir, basename(executable)) | ||||
|             break | ||||
|     else: | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Steve Dower
						Steve Dower