def run_script(self, pathname, caller=None): """ Create a node by path (not module name). It is expected to be a Python source file, and will be scanned for dependencies. """ self.msg(2, "run_script", pathname) pathname = os.path.realpath(pathname) m = self.findNode(pathname) if m is not None: return m if sys.version_info[0] != 2: with open(pathname, 'rb') as fp: encoding = util.guess_encoding(fp) fp = open(pathname, _READ_MODE, encoding=encoding) try: contents = fp.read() + '\n' finally: fp.close() else: with open(pathname, _READ_MODE) as fp: contents = fp.read() + '\n' co = compile(contents, pathname, 'exec', 0, True) if self.replace_paths: co = self.replace_paths_in_code(co) m = self.createNode(Script, pathname) m.code = co self.createReference(caller, m) self.scan_code(co, m) return m
def test_guess_encoding(self): fp = BytesIO(b"# coding: utf-8") self.assertEqual(util.guess_encoding(fp), "utf-8") fp = BytesIO(b"\n# coding: utf-8") self.assertEqual(util.guess_encoding(fp), "utf-8") fp = BytesIO(b"# coding: latin-1") self.assertEqual(util.guess_encoding(fp), "latin-1") fp = BytesIO(b"\n# coding: latin-1") self.assertEqual(util.guess_encoding(fp), "latin-1") fp = BytesIO(b"#!/usr/bin/env/python\n# vim: set fileencoding=latin-1 :") self.assertEqual(util.guess_encoding(fp), "latin-1") fp = BytesIO(b"\n\n\n# coding: latin-1") if sys.version_info[0] == 2: self.assertEqual(util.guess_encoding(fp), "ascii") else: self.assertEqual(util.guess_encoding(fp), "utf-8") del fp
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, "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)
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)