我们从Python开源项目中,提取了以下50个代码示例,用于说明如何使用pkgutil.get_loader()。
def _get_module_details(mod_name): loader = get_loader(mod_name) if loader is None: raise ImportError("No module named %s" % mod_name) if loader.is_package(mod_name): if mod_name == "__main__" or mod_name.endswith(".__main__"): raise ImportError("Cannot use package as __main__ module") try: pkg_main_name = mod_name + ".__main__" return _get_module_details(pkg_main_name) except ImportError, e: raise ImportError(("%s; %r is a package and cannot " + "be directly executed") %(e, mod_name)) code = loader.get_code(mod_name) if code is None: raise ImportError("No code object available for %s" % mod_name) filename = _get_filename(loader, mod_name) return mod_name, loader, code, filename
def check_python_import(package_or_module): """ Checks if a python package or module is importable. Arguments: package_or_module -- the package or module name to check Returns: True or False """ logger = logging.getLogger(__name__) logger.debug("Checking python import '%s'...", package_or_module) loader = pkgutil.get_loader(package_or_module) found = loader is not None if found: logger.debug("Python %s '%s' found: %r", "package" if loader.is_package(package_or_module) else "module", package_or_module, loader.get_filename()) else: logger.debug("Python import '%s' not found", package_or_module) return found
def get_filename(package, resource): """Rewrite of pkgutil.get_data() that return the file path. """ loader = pkgutil.get_loader(package) if loader is None or not hasattr(loader, 'get_data'): return None mod = sys.modules.get(package) or loader.load_module(package) if mod is None or not hasattr(mod, '__file__'): return None # Modify the resource name to be compatible with the loader.get_data # signature - an os.path format "filename" starting with the dirname of # the package's __file__ parts = resource.split('/') parts.insert(0, os.path.dirname(mod.__file__)) resource_name = os.path.normpath(os.path.join(*parts)) return resource_name
def _package_path(name): """Returns the path to the package containing the named module or None if the path could not be identified (e.g., if ``name == "__main__"``). """ loader = pkgutil.get_loader(name) if loader is None or name == b'__main__': return None if hasattr(loader, 'get_filename'): filepath = loader.get_filename(name) else: # Fall back to importing the specified module. __import__(name) filepath = sys.modules[name].__file__ return os.path.dirname(os.path.abspath(filepath))
def _get_module_details(mod_name): loader = get_loader(mod_name) if loader is None: raise ImportError("No module named %s" % mod_name) if loader.is_package(mod_name): if mod_name == "__main__" or mod_name.endswith(".__main__"): raise ImportError("Cannot use package as __main__ module") try: pkg_main_name = mod_name + ".__main__" return _get_module_details(pkg_main_name) except ImportError as e: raise ImportError(("%s; %r is a package and cannot " + "be directly executed") %(e, mod_name)) code = loader.get_code(mod_name) if code is None: raise ImportError("No code object available for %s" % mod_name) filename = _get_filename(loader, mod_name) return mod_name, loader, code, filename # XXX ncoghlan: Should this be documented and made public? # (Current thoughts: don't repeat the mistake that lead to its # creation when run_module() no longer met the needs of # mainmodule.c, but couldn't be changed because it was public)
def patch_pkgutil_get_loader(wrapper_class=LimitedLoaderMockWrapper): """Patch pkgutil.get_loader to give loader without get_filename or archive. This provides for tests where a system has custom loaders, e.g. Google App Engine's HardenedModulesHook, which have neither the `get_filename` method nor the `archive` attribute. """ old_get_loader = pkgutil.get_loader def get_loader(*args, **kwargs): return wrapper_class(old_get_loader(*args, **kwargs)) try: pkgutil.get_loader = get_loader yield finally: pkgutil.get_loader = old_get_loader
def get_root_path(import_name): """Returns the path to a package or cwd if that cannot be found. This returns the path of a package or the folder that contains a module. Not to be confused with the package path returned by :func:`find_package`. """ # Module already imported and has a file attribute. Use that first. mod = sys.modules.get(import_name) if mod is not None and hasattr(mod, '__file__'): return os.path.dirname(os.path.abspath(mod.__file__)) # Next attempt: check the loader. loader = pkgutil.get_loader(import_name) # Loader does not exist or we're referring to an unloaded main module # or a main module without path (interactive sessions), go with the # current working directory. if loader is None or import_name == '__main__': return os.getcwd() # For .egg, zipimporter does not have get_filename until Python 2.7. # Some other loaders might exhibit the same behavior. if hasattr(loader, 'get_filename'): filepath = loader.get_filename(import_name) else: # Fall back to imports. __import__(import_name) filepath = sys.modules[import_name].__file__ # filepath is import_name.py for a module, or __init__.py for a package. return os.path.dirname(os.path.abspath(filepath))
def test_pep302_loader_builtin(pyi_builder): pyi_builder.test_source( """ mod = 'sys' import pkgutil ldr = pkgutil.get_loader(mod) assert ldr assert ldr.is_package(mod) == False assert ldr.get_code(mod) is None assert ldr.get_source(mod) is None """)
def test_pep302_loader_frozen_module(pyi_builder): pyi_builder.test_source( """ mod = 'compileall' import pkgutil ldr = pkgutil.get_loader(mod) assert ldr assert ldr.is_package(mod) == False assert ldr.get_code(mod) is not None assert ldr.get_source(mod) is None # Import at the very end, just to get the module frozen. import compileall """)
def test_pep302_loader_frozen_package(pyi_builder): pyi_builder.test_source( """ mod = 'distutils' import pkgutil ldr = pkgutil.get_loader(mod) assert ldr assert ldr.is_package(mod) == True assert ldr.get_code(mod) is not None assert ldr.get_source(mod) is None # Import at the very end, just to get the module frozen. import distutils """)
def test_pep302_loader_frozen_submodule(pyi_builder): pyi_builder.test_source( """ mod = 'distutils.config' import pkgutil ldr = pkgutil.get_loader(mod) assert ldr assert ldr.is_package(mod) == False assert ldr.get_code(mod) is not None assert ldr.get_source(mod) is None # Import at the very end, just to get the module frozen. import distutils.config """)
def test_pep302_loader_cextension(pyi_builder): pyi_builder.test_source( """ mod = '_sqlite3' import pkgutil ldr = pkgutil.get_loader(mod) assert ldr assert ldr.is_package(mod) == False assert ldr.get_code(mod) is None assert ldr.get_source(mod) is None # Import at the very end, just to get the module frozen. import sqlite3 """)
def _get_module_details(mod_name, error=ImportError): try: loader = get_loader(mod_name) if loader is None: raise error("No module named %s" % mod_name) ispkg = loader.is_package(mod_name) except ImportError as e: raise error(format(e)) if ispkg: if mod_name == "__main__" or mod_name.endswith(".__main__"): raise error("Cannot use package as __main__ module") __import__(mod_name) # Do not catch exceptions initializing package try: pkg_main_name = mod_name + ".__main__" return _get_module_details(pkg_main_name) except ImportError, e: raise error(("%s; %r is a package and cannot " + "be directly executed") %(e, mod_name)) try: code = loader.get_code(mod_name) except ImportError as e: raise error(format(e)) if code is None: raise error("No code object available for %s" % mod_name) filename = _get_filename(loader, mod_name) return mod_name, loader, code, filename