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']