mirror of
https://github.com/python/cpython.git
synced 2025-10-10 00:43:41 +00:00
Use the cwd when the empty string is found in sys.path. This leads to
__file__ being an absolute path when the module is found in the current directory.
This commit is contained in:
parent
354c26ecd6
commit
b4e63b3177
3 changed files with 58 additions and 1 deletions
|
@ -718,7 +718,7 @@ class PathFinder:
|
|||
try:
|
||||
finder = sys.path_importer_cache[path]
|
||||
except KeyError:
|
||||
finder = cls._path_hooks(path)
|
||||
finder = cls._path_hooks(path if path != '' else _os.getcwd())
|
||||
sys.path_importer_cache[path] = finder
|
||||
else:
|
||||
if finder is None and default:
|
||||
|
@ -1039,3 +1039,47 @@ def _setup(sys_module, imp_module):
|
|||
setattr(self_module, '_os', os_module)
|
||||
setattr(self_module, 'path_sep', path_sep)
|
||||
|
||||
|
||||
|
||||
def _setup(sys_module, imp_module):
|
||||
"""Setup importlib by importing needed built-in modules and injecting them
|
||||
into the global namespace.
|
||||
|
||||
As sys is needed for sys.modules access and imp is needed to load built-in
|
||||
modules those two modules must be explicitly passed in.
|
||||
|
||||
"""
|
||||
global imp, sys
|
||||
imp = imp_module
|
||||
sys = sys_module
|
||||
|
||||
for module in (imp, sys):
|
||||
if not hasattr(module, '__loader__'):
|
||||
module.__loader__ = BuiltinImporter
|
||||
|
||||
self_module = sys.modules[__name__]
|
||||
for builtin_name in ('_io', '_warnings', 'builtins', 'marshal'):
|
||||
if builtin_name not in sys.modules:
|
||||
builtin_module = BuiltinImporter.load_module(builtin_name)
|
||||
else:
|
||||
builtin_module = sys.modules[builtin_name]
|
||||
setattr(self_module, builtin_name, builtin_module)
|
||||
|
||||
for builtin_os, path_sep in [('posix', '/'), ('nt', '\\'), ('os2', '\\')]:
|
||||
if builtin_os in sys.modules:
|
||||
os_module = sys.modules[builtin_os]
|
||||
break
|
||||
else:
|
||||
try:
|
||||
os_module = BuiltinImporter.load_module(builtin_os)
|
||||
# TODO: rip out os2 code after 3.3 is released as per PEP 11
|
||||
if builtin_os == 'os2' and 'EMX GCC' in sys.version:
|
||||
path_sep = '/'
|
||||
break
|
||||
except ImportError:
|
||||
continue
|
||||
else:
|
||||
raise ImportError('importlib requires posix or nt')
|
||||
setattr(self_module, '_os', os_module)
|
||||
setattr(self_module, 'path_sep', path_sep)
|
||||
|
||||
|
|
|
@ -73,6 +73,16 @@ class FinderTests(unittest.TestCase):
|
|||
loader = machinery.PathFinder.find_module(module)
|
||||
self.assertTrue(loader is importer)
|
||||
|
||||
def test_path_importer_cache_empty_string(self):
|
||||
# The empty string should create a finder using the cwd.
|
||||
path = ''
|
||||
module = '<test module>'
|
||||
importer = util.mock_modules(module)
|
||||
hook = import_util.mock_path_hook(os.getcwd(), importer=importer)
|
||||
with util.import_state(path=[path], path_hooks=[hook]):
|
||||
loader = machinery.PathFinder.find_module(module)
|
||||
self.assertIs(loader, importer)
|
||||
self.assertIn('', sys.path_importer_cache)
|
||||
|
||||
|
||||
class DefaultPathFinderTests(unittest.TestCase):
|
||||
|
|
|
@ -466,6 +466,9 @@ Core and Builtins
|
|||
Library
|
||||
-------
|
||||
|
||||
- When '' is a path (e.g. in sys.path), make sure __file__ uses the current
|
||||
working directory instead of ''.
|
||||
|
||||
- Issue #13609: Add two functions to query the terminal size:
|
||||
os.get_terminal_size (low level) and shutil.get_terminal_size (high level).
|
||||
Patch by Zbigniew Jędrzejewski-Szmek.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue