def calc_setuptools_nspackages(self): # Setuptools has some magic handling for namespace # packages when using 'install --single-version-externally-managed' # (used by system packagers and also by pip) # # When this option is used namespace packages are writting to # disk *without* an __init__.py file, which means the regular # import machinery will not find them. # # We therefore explicitly look for the hack used by # setuptools to get this kind of namespace packages to work. pkgmap = {} try: from pkgutil import ImpImporter except ImportError: try: from _pkgutil import ImpImporter except ImportError: ImpImporter = pkg_resources.ImpWrapper for entry in self.path: importer = pkg_resources.get_importer(entry) if isinstance(importer, ImpImporter): try: ldir = os.listdir(entry) except os.error: continue for fn in ldir: if fn.endswith("-nspkg.pth"): fp = open(os.path.join(entry, fn), "rU") try: for ln in fp: for pfx in _SETUPTOOLS_NAMESPACEPKG_PTHs: if ln.startswith(pfx): try: start = len(pfx) - 2 stop = ln.index(")", start) + 1 except ValueError: continue pkg = _eval_str_tuple(ln[start:stop]) identifier = ".".join(pkg) subdir = os.path.join(entry, *pkg) if os.path.exists(os.path.join(subdir, "__init__.py")): # There is a real __init__.py, ignore the setuptools hack continue if identifier in pkgmap: pkgmap[identifier].append(subdir) else: pkgmap[identifier] = [subdir] break finally: fp.close() return pkgmap
def find_module(name, path=None): """ A version of imp.find_module that works with zipped packages. """ if path is None: path = sys.path for entry in path: importer = pkg_resources.get_importer(entry) loader = importer.find_module(name) if loader is None: continue if isinstance(importer, pkg_resources.ImpWrapper): filename = loader.filename if filename.endswith('.pyc') or filename.endswith('.pyo'): fp = open(filename, 'rb') description = ('.pyc', 'rb', imp.PY_COMPILED) return (fp, filename, description) elif filename.endswith('.py'): fp = file(filename, READ_MODE) description = ('.py', READ_MODE, imp.PY_SOURCE) return (fp, filename, description) else: for _sfx, _mode, _type in imp.get_suffixes(): if _type == imp.C_EXTENSION and filename.endswith(_sfx): description = (_sfx, 'rb', imp.C_EXTENSION) break else: description = ('', '', imp.PKG_DIRECTORY) return (None, filename, description) elif hasattr(loader, 'get_code'): co = loader.get_code(name) fp = _code_to_file(co) pathname = os.path.join(entry, *name.split('.')) if isinstance(loader, zipimport.zipimporter): # Check if this happens to be a wrapper module introduced by setuptools, # if it is we return the actual extension. zn = '/'.join(name.split('.')) for _sfx, _mode, _type in imp.get_suffixes(): if _type == imp.C_EXTENSION: p = loader.prefix + zn + _sfx if p in loader._files: description = (_sfx, 'rb', imp.C_EXTENSION) return (None, pathname + _sfx, description) if hasattr(loader, 'is_package') and loader.is_package(name): return (None, pathname, ('', '', imp.PKG_DIRECTORY)) pathname = pathname + '.pyc' description = ('.pyc', 'rb', imp.PY_COMPILED) return (fp, pathname, description) raise ImportError(name)
def calc_setuptools_nspackages(self): # Setuptools has some magic handling for namespace # packages when using 'install --single-version-externally-managed' # (used by system packagers and also by pip) # # When this option is used namespace packages are writting to # disk *without* and __init__.py file, which means the regular # import machinery will not find them. # # We therefore explicitly look for the hack used by # setuptools to get this kind of namespace packages to work. pkgmap = {} try: from pkgutil import ImpImporter except ImportError: try: from _pkgutil import ImpImporter except ImportError: ImpImporter = pkg_resources.ImpWrapper for entry in self.path: importer = pkg_resources.get_importer(entry) if isinstance(importer, ImpImporter): for fn in os.listdir(entry): if fn.endswith('-nspkg.pth'): for ln in open(os.path.join(entry, fn), 'rU'): if ln.startswith(SETUPTOOLS_NAMESPACEPKG_PTH): try: start = len(SETUPTOOLS_NAMESPACEPKG_PTH)-2 stop = ln.index(')', start)+1 except ValueError: continue # XXX: this is unsafe pkg = eval(ln[start:stop]) identifier = ".".join(pkg) subdir = os.path.join(entry, *pkg) if os.path.exists(os.path.join(subdir, '__init__.py')): # There is a real __init__.py, ignore the setuptools hack continue m = pkgmap[identifier] = subdir return pkgmap
def find_module(name, path=None): """ A version of imp.find_module that works with zipped packages. """ if path is None: path = sys.path # Support for the PEP302 importer for normal imports: # - Python 2.5 has pkgutil.ImpImporter # - In setuptools 0.7 and later there's _pkgutil.ImpImporter # - In earlier setuptools versions you pkg_resources.ImpWrapper # # XXX: This is a bit of a hack, should check if we can just rely on # PEP302's get_code() method with all recent versions of pkgutil and/or # setuptools (setuptools 0.6.latest, setuptools trunk and python2.[45]) # # For python 3.3 this code should be replaced by code using importlib, # for python 3.2 and 2.7 this should be cleaned up a lot. try: from pkgutil import ImpImporter except ImportError: try: from _pkgutil import ImpImporter except ImportError: ImpImporter = pkg_resources.ImpWrapper namespace_path =[] fp = None for entry in path: importer = pkg_resources.get_importer(entry) if importer is None: continue if sys.version_info[:2] >= (3,3) and hasattr(importer, 'find_loader'): loader, portions = importer.find_loader(name) else: loader = importer.find_module(name) portions = [] namespace_path.extend(portions) if loader is None: continue if isinstance(importer, ImpImporter): filename = loader.filename if filename.endswith('.pyc') or filename.endswith('.pyo'): fp = open(filename, 'rb') description = ('.pyc', 'rb', imp.PY_COMPILED) return (fp, filename, description) elif filename.endswith('.py'): if sys.version_info[0] == 2: fp = open(filename, _READ_MODE) else: with open(filename, 'rb') as fp: encoding = util.guess_encoding(fp) fp = open(filename, _READ_MODE, encoding=encoding) description = ('.py', _READ_MODE, imp.PY_SOURCE) return (fp, filename, description) else: for _sfx, _mode, _type in imp.get_suffixes(): if _type == imp.C_EXTENSION and filename.endswith(_sfx): description = (_sfx, 'rb', imp.C_EXTENSION) break else: description = ('', '', imp.PKG_DIRECTORY) return (None, filename, description) if hasattr(loader, 'path'): if loader.path.endswith('.pyc') or loader.path.endswith('.pyo'): fp = open(loader.path, 'rb') description = ('.pyc', 'rb', imp.PY_COMPILED) return (fp, loader.path, description) if hasattr(loader, 'path') and hasattr(loader, 'get_source'): source = loader.get_source(name) fp = StringIO(source) co = None else: source = None if source is None: if hasattr(loader, 'get_code'): co = loader.get_code(name) fp = _code_to_file(co) else: fp = None co = None pathname = os.path.join(entry, *name.split('.')) if isinstance(loader, zipimport.zipimporter): # Check if this happens to be a wrapper module introduced by # setuptools, if it is we return the actual extension. zn = '/'.join(name.split('.')) for _sfx, _mode, _type in imp.get_suffixes(): if _type == imp.C_EXTENSION: p = loader.prefix + zn + _sfx if loader._files is None: loader_files = zipimport._zip_directory_cache[loader.archive] else: loader_files = loader._files if p in loader_files: description = (_sfx, 'rb', imp.C_EXTENSION) return (None, pathname + _sfx, description) if hasattr(loader, 'is_package') and loader.is_package(name): return (None, pathname, ('', '', imp.PKG_DIRECTORY)) if co is None: if loader.path.endswith('.py') or loader.path.endswith('.pyw'): return (fp, loader.path, ('.py', 'rU', imp.PY_SOURCE)) else: if fp is not None: fp.close() return (None, loader.path, (os.path.splitext(loader.path)[-1], 'rb', imp.C_EXTENSION)) else: if hasattr(loader, 'path'): return (fp, loader.path, ('.pyc', 'rb', imp.PY_COMPILED)) else: return (fp, pathname + '.pyc', ('.pyc', 'rb', imp.PY_COMPILED)) if namespace_path: if fp is not None: fp.close() return (None, namespace_path[0], ('', namespace_path, imp.PKG_DIRECTORY)) raise ImportError(name)
def find_module(name, path=None): """ A version of imp.find_module that works with zipped packages. """ if path is None: path = sys.path # Support for the PEP302 importer for normal imports: # - Python 2.5 has pkgutil.ImpImporter # - In setuptools 0.7 and later there's _pkgutil.ImpImporter # - In earlier setuptools versions you pkg_resources.ImpWrapper # # This is a bit of a hack, should check if we can just rely on # PEP302's get_code() method with all recent versions of pkgutil and/or # setuptools (setuptools 0.6.latest, setuptools trunk and python2.[45]) try: from pkgutil import ImpImporter except ImportError: try: from _pkgutil import ImpImporter except ImportError: ImpImporter = pkg_resources.ImpWrapper for entry in path: importer = pkg_resources.get_importer(entry) loader = importer.find_module(name) if loader is None: continue if isinstance(importer, ImpImporter): filename = loader.filename if filename.endswith('.pyc') or filename.endswith('.pyo'): fp = open(filename, 'rb') description = ('.pyc', 'rb', imp.PY_COMPILED) return (fp, filename, description) elif filename.endswith('.py'): if sys.version_info[0] == 2: fp = open(filename, READ_MODE) else: fp = open(filename, READ_MODE, encoding=util.guess_encoding(open(filename, 'rb'))) description = ('.py', READ_MODE, imp.PY_SOURCE) return (fp, filename, description) else: for _sfx, _mode, _type in imp.get_suffixes(): if _type == imp.C_EXTENSION and filename.endswith(_sfx): description = (_sfx, 'rb', imp.C_EXTENSION) break else: description = ('', '', imp.PKG_DIRECTORY) return (None, filename, description) elif hasattr(loader, 'get_code'): co = loader.get_code(name) fp = _code_to_file(co) pathname = os.path.join(entry, *name.split('.')) if isinstance(loader, zipimport.zipimporter): # Check if this happens to be a wrapper module introduced by setuptools, # if it is we return the actual extension. zn = '/'.join(name.split('.')) for _sfx, _mode, _type in imp.get_suffixes(): if _type == imp.C_EXTENSION: p = loader.prefix + zn + _sfx if p in loader._files: description = (_sfx, 'rb', imp.C_EXTENSION) return (None, pathname + _sfx, description) if hasattr(loader, 'is_package') and loader.is_package(name): return (None, pathname, ('', '', imp.PKG_DIRECTORY)) pathname = pathname + '.pyc' description = ('.pyc', 'rb', imp.PY_COMPILED) return (fp, pathname, description) raise ImportError(name)
def calc_setuptools_nspackages(self): # Setuptools has some magic handling for namespace # packages when using 'install --single-version-externally-managed' # (used by system packagers and also by pip) # # When this option is used namespace packages are writting to # disk *without* an __init__.py file, which means the regular # import machinery will not find them. # # We therefore explicitly look for the hack used by # setuptools to get this kind of namespace packages to work. pkgmap = {} try: from pkgutil import ImpImporter except ImportError: try: from _pkgutil import ImpImporter except ImportError: ImpImporter = pkg_resources.ImpWrapper if sys.version_info[:2] >= (3,3): import importlib.machinery ImpImporter = importlib.machinery.FileFinder for entry in self.path: importer = pkg_resources.get_importer(entry) if isinstance(importer, ImpImporter): try: ldir = os.listdir(entry) except os.error: continue for fn in ldir: if fn.endswith('-nspkg.pth'): fp = open(os.path.join(entry, fn), 'rU') try: for ln in fp: for pfx in _SETUPTOOLS_NAMESPACEPKG_PTHs: if ln.startswith(pfx): try: start = len(pfx)-2 stop = ln.index(')', start)+1 except ValueError: continue pkg = _eval_str_tuple(ln[start:stop]) identifier = ".".join(pkg) subdir = os.path.join(entry, *pkg) if os.path.exists(os.path.join(subdir, '__init__.py')): # There is a real __init__.py, ignore the setuptools hack continue if identifier in pkgmap: pkgmap[identifier].append(subdir) else: pkgmap[identifier] = [subdir] break finally: fp.close() return pkgmap
def find_module(name, path=None): """ A version of imp.find_module that works with zipped packages. """ if path is None: path = sys.path # Support for the PEP302 importer for normal imports: # - Python 2.5 has pkgutil.ImpImporter # - In setuptools 0.7 and later there's _pkgutil.ImpImporter # - In earlier setuptools versions you pkg_resources.ImpWrapper # # XXX: This is a bit of a hack, should check if we can just rely on # PEP302's get_code() method with all recent versions of pkgutil and/or # setuptools (setuptools 0.6.latest, setuptools trunk and python2.[45]) # # For python 3.3 this code should be replaced by code using importlib, # for python 3.2 and 2.7 this should be cleaned up a lot. try: from pkgutil import ImpImporter except ImportError: try: from _pkgutil import ImpImporter except ImportError: ImpImporter = pkg_resources.ImpWrapper namespace_path =[] fp = None for entry in path: importer = pkg_resources.get_importer(entry) if importer is None: continue if sys.version_info[:2] >= (3,3) and hasattr(importer, 'find_loader'): loader, portions = importer.find_loader(name) else: loader = importer.find_module(name) portions = [] namespace_path.extend(portions) if loader is None: continue if isinstance(importer, ImpImporter): filename = loader.filename if filename.endswith('.pyc') or filename.endswith('.pyo'): fp = open(filename, 'rb') description = ('.pyc', 'rb', imp.PY_COMPILED) return (fp, filename, description) elif filename.endswith('.py'): if sys.version_info[0] == 2: fp = open(filename, _READ_MODE) else: with open(filename, 'rb') as fp: encoding = util.guess_encoding(fp) fp = open(filename, _READ_MODE, encoding=encoding) description = ('.py', _READ_MODE, imp.PY_SOURCE) return (fp, filename, description) else: for _sfx, _mode, _type in imp.get_suffixes(): if _type == imp.C_EXTENSION and filename.endswith(_sfx): description = (_sfx, 'rb', imp.C_EXTENSION) break else: description = ('', '', imp.PKG_DIRECTORY) return (None, filename, description) if hasattr(loader, 'path'): if loader.path.endswith('.pyc') or loader.path.endswith('.pyo'): fp = open(loader.path, 'rb') description = ('.pyc', 'rb', imp.PY_COMPILED) return (fp, loader.path, description) if hasattr(loader, 'path') and hasattr(loader, 'get_source'): source = loader.get_source(name) fp = StringIO(source) co = None else: source = None if source is None: if hasattr(loader, 'get_code'): co = loader.get_code(name) fp = _code_to_file(co) else: fp = None co = None pathname = os.path.join(entry, *name.split('.')) if isinstance(loader, zipimport.zipimporter): # Check if this happens to be a wrapper module introduced by # setuptools, if it is we return the actual extension. zn = '/'.join(name.split('.')) for _sfx, _mode, _type in imp.get_suffixes(): if _type == imp.C_EXTENSION: p = loader.prefix + zn + _sfx if p in loader._files: description = (_sfx, 'rb', imp.C_EXTENSION) return (None, pathname + _sfx, description) if hasattr(loader, 'is_package') and loader.is_package(name): return (None, pathname, ('', '', imp.PKG_DIRECTORY)) if co is None: if loader.path.endswith('.py') or loader.path.endswith('.pyw'): return (fp, loader.path, ('.py', 'rU', imp.PY_SOURCE)) else: if fp is not None: fp.close() return (None, loader.path, (os.path.splitext(loader.path)[-1], 'rb', imp.C_EXTENSION)) else: if hasattr(loader, 'path'): return (fp, loader.path, ('.pyc', 'rb', imp.PY_COMPILED)) else: return (fp, pathname + '.pyc', ('.pyc', 'rb', imp.PY_COMPILED)) if namespace_path: if fp is not None: fp.close() return (None, namespace_path[0], ('', namespace_path, imp.PKG_DIRECTORY)) raise ImportError(name)
def find_module(name, path=None): """ A version of imp.find_module that works with zipped packages. """ if path is None: path = sys.path # Support for the PEP302 importer for normal imports: # - Python 2.5 has pkgutil.ImpImporter # - In setuptools 0.7 and later there's _pkgutil.ImpImporter # - In earlier setuptools versions you pkg_resources.ImpWrapper # # This is a bit of a hack, should check if we can just rely on # PEP302's get_code() method with all recent versions of pkgutil and/or # setuptools (setuptools 0.6.latest, setuptools trunk and python2.[45]) try: from pkgutil import ImpImporter except ImportError: try: from _pkgutil import ImpImporter except ImportError: ImpImporter = pkg_resources.ImpWrapper for entry in path: importer = pkg_resources.get_importer(entry) loader = importer.find_module(name) if loader is None: continue if isinstance(importer, ImpImporter): filename = loader.filename if filename.endswith('.pyc') or filename.endswith('.pyo'): fp = open(filename, 'rb') description = ('.pyc', 'rb', imp.PY_COMPILED) return (fp, filename, description) elif filename.endswith('.py'): if sys.version_info[0] == 2: fp = open(filename, _READ_MODE) else: fp = open(filename, 'rb') try: encoding = util.guess_encoding(fp) finally: fp.close() fp = open(filename, _READ_MODE, encoding=encoding) description = ('.py', _READ_MODE, imp.PY_SOURCE) return (fp, filename, description) else: for _sfx, _mode, _type in imp.get_suffixes(): if _type == imp.C_EXTENSION and filename.endswith(_sfx): description = (_sfx, 'rb', imp.C_EXTENSION) break else: description = ('', '', imp.PKG_DIRECTORY) return (None, filename, description) elif hasattr(loader, 'get_code'): co = loader.get_code(name) fp = _code_to_file(co) else: fp = None co = None pathname = os.path.join(entry, *name.split('.')) if isinstance(loader, zipimport.zipimporter): # Check if this happens to be a wrapper module introduced by # setuptools, if it is we return the actual extension. zn = '/'.join(name.split('.')) for _sfx, _mode, _type in imp.get_suffixes(): if _type == imp.C_EXTENSION: p = loader.prefix + zn + _sfx if p in loader._files: description = (_sfx, 'rb', imp.C_EXTENSION) return (None, pathname + _sfx, description) if hasattr(loader, 'is_package') and loader.is_package(name): return (None, pathname, ('', '', imp.PKG_DIRECTORY)) if co is None: pathname = pathname + '.py' description = ('.pyc', 'rb', imp.PY_COMPILED) return (fp, pathname, ('.py', 'rU', imp.PY_SOURCE)) else: pathname = pathname + '.pyc' description = ('.pyc', 'rb', imp.PY_COMPILED) return (fp, pathname, ('.pyc', 'rb', imp.PY_COMPILED)) raise ImportError(name)