import_stmt:  "import" identifier ("," identifier)*
                  | "from" identifier "import" identifier ("," identifier)*
                  | "from" identifier "import" "*"
    
    import_stmt:  "import" module ("," module)* 
                  | "from" module "import" identifier ("," identifier)*
                  | "from" module "import" "*" 
    module:       (identifier ".")* identifier
    import_stmt:  "import" module ["as" name] ("," module ["as" name] )* 
                  | "from" module "import" identifier ["as" name]
                  ("," identifier ["as" name] )*
                  | "from" module "import" "*" 
    module:       (identifier ".")* identifier
    import_stmt:       "import" module ["as" name] ( "," module ["as" name] )*
                       | "from" relative_module "import" identifier ["as" name]
                       ( "," identifier ["as" name] )*
                       | "from" relative_module "import" "(" identifier ["as" name]
                       ( "," identifier ["as" name] )* [","] ")"
                       | "from" module "import" "*"
    module :           (identifier ".")* identifier
    relative_module :  "."* module | "."+
    name :             identifier
import sys sys.modules sys.meta_path class DummyFinder: def find_module(self, fullname, paths=None): print('find_module - fullname: {}, paths: {}'.format(fullname, paths)) return None sys.meta_path.insert(0, DummyFinder()) sys.path.append('./workspace/') import eggs from spam import bacon del sys.modules['spam'] del sys.modules['spam.bacon'] import spam.bacon 'eggs' in sys.modules 'spam' in sys.modules 'spam.bacon' in sys.modules del sys.meta_path[0] del sys.modules['eggs'] del sys.modules['spam'] del sys.modules['spam.bacon'] class DummyFinder: def find_module(self, fullname, paths=None): print('find_module - fullname: {}, paths: {}'.format(fullname, paths)) if fullname == 'eggs': return DummyLoader() else: return None class DummyLoader: def load_module(self, fullname): print('load_module - fullname: {}'.format(fullname)) raise ImportError('spam spam spam') sys.meta_path.insert(0, DummyFinder()) import eggs del sys.meta_path[0] class DummyImporter: def find_module(self, fullname, paths=None): print('find_module - fullname: {}, paths: {}'.format(fullname, paths)) if fullname == 'eggs': return self else: return None def load_module(self, fullname): print('load_module - fullname: {}'.format(fullname)) raise ImportError('spam spam spam') sys.meta_path.insert(0, DummyImporter()) del sys.meta_path[0] import types class DynamicImporter: def __init__(self, name, code): self.name = name self.code = code def find_module(self, name, path): if name == self.name: return self else: return None def load_module(self, name): if name in sys.modules: module = sys.modules[name] else: module = types.ModuleType(name) sys.modules[name] = module module.__loader__ = self exec(self.code, module.__dict__) return module sys.meta_path.insert(0, DynamicImporter(name='spam', code='eggs = True')) import spam print(spam.eggs) del sys.meta_path[0] import a sys.meta_path sys.path_hooks sys.path_importer_cache def http_path_entry_hook(path): if path.startswith('http://') or path.startswith('https://'): return HttpPathEntryFinder(path) else: raise ImportError() import requests class HttpPathEntryFinder: def __init__(self, path): self.path = path def find_loader(self, name): url = self.path + name + '.py' if requests.head(url).status_code == 200: return HttpLoader(url), None else: raise ImportError() class HttpLoader: def __init__(self, url): self.url = url def load_module(self, name): if name in sys.modules: module = sys.modules[name] else: module = types.ModuleType(name) sys.modules[name] = module module.__loader__ = self module.__file__ = self.url response = requests.get(self.url) exec(response.content, module.__dict__) return module sys.path_hooks.insert(0, http_path_entry_hook) sys.path.append('https://raw.github.com/jcrocholl/pep8/master/') import pep8 pep8 pep8.Checker(lines=['x + y\n']).check_all() del sys.path[-1] del sys.path_hooks[0] del sys.modules['pep8']