Issue #13959: Introduce importlib.find_loader().

The long-term goal is to deprecate imp.find_module() in favour of this
API, but it will take some time as some APIs explicitly return/use what
imp.find_module() returns.
This commit is contained in:
Brett Cannon 2012-05-12 17:43:17 -04:00
parent acc0c181a8
commit ee78a2b51c
5 changed files with 105 additions and 10 deletions

View file

@ -39,8 +39,10 @@ Instances of this class have the following instance variables:
lineno -- the line in the file on which the class statement occurred
"""
import io
import os
import sys
import imp
import importlib
import tokenize
from token import NAME, DEDENT, OP
from operator import itemgetter
@ -133,19 +135,24 @@ def _readmodule(module, path, inpackage=None):
# Search the path for the module
f = None
if inpackage is not None:
f, fname, (_s, _m, ty) = imp.find_module(module, path)
search_path = path
else:
f, fname, (_s, _m, ty) = imp.find_module(module, path + sys.path)
if ty == imp.PKG_DIRECTORY:
dict['__path__'] = [fname]
path = [fname] + path
f, fname, (_s, _m, ty) = imp.find_module('__init__', [fname])
search_path = path + sys.path
loader = importlib.find_loader(fullmodule, search_path)
fname = loader.get_filename(fullmodule)
_modules[fullmodule] = dict
if ty != imp.PY_SOURCE:
if loader.is_package(fullmodule):
dict['__path__'] = [os.path.dirname(fname)]
try:
source = loader.get_source(fullmodule)
if source is None:
return dict
except (AttributeError, ImportError):
# not Python source, can't do anything with this module
f.close()
return dict
f = io.StringIO(source)
stack = [] # stack of (class, indent) pairs
g = tokenize.generate_tokens(f.readline)