mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +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) |         actual = getpath(ns, expected) | ||||||
|         self.assertEqual(expected, actual) |         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): |     def test_symlink_normal_posix(self): | ||||||
|         "Test a 'standard' install layout via symlink on *nix" |         "Test a 'standard' install layout via symlink on *nix" | ||||||
|         ns = MockPosixNamespace( |         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('=') |         key, had_equ, value = line.partition('=') | ||||||
|         if had_equ and key.strip().lower() == 'home': |         if had_equ and key.strip().lower() == 'home': | ||||||
|             executable_dir = real_executable_dir = value.strip() |             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)) |                     base_executable = joinpath(executable_dir, basename(executable)) | ||||||
|             break |             break | ||||||
|     else: |     else: | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Steve Dower
						Steve Dower