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:
Brett Cannon 2012-02-08 18:52:56 -05:00
parent 354c26ecd6
commit b4e63b3177
3 changed files with 58 additions and 1 deletions

View file

@ -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)