def load_module(self, fullname, path=None): imp_lock() module = None try: if sys.version_info[0] == 2: # Python 2 implementation - TODO drop or improve it. 'imp' module is no longer built-in. # PEP302 If there is an existing module object named 'fullname' # in sys.modules, the loader must use that existing module. module = sys.modules.get(fullname) if module is None: # TODO fix variables _c_ext_tuple and _suffix. filename = pyi_os_path.os_path_join(SYS_PREFIX, fullname + self._suffix) fp = open(filename, 'rb') module = imp.load_module(fullname, fp, filename, self._c_ext_tuple) # Set __file__ attribute. if hasattr(module, '__setattr__'): module.__file__ = filename else: # Some modules (eg: Python for .NET) have no __setattr__ # and dict entry have to be set. module.__dict__['__file__'] = filename else: # PEP302 If there is an existing module object named 'fullname' # in sys.modules, the loader must use that existing module. module = sys.modules.get(fullname) if module is None: # Python 3 implementation. for ext in EXTENSION_SUFFIXES: filename = pyi_os_path.os_path_join(SYS_PREFIX, fullname + ext) # Test if a file exists. # Cannot use os.path.exists. Use workaround with function open(). # No exception means that a file exists. try: with open(filename): pass except IOError: # Continue trying new suffix. continue # Load module. import _frozen_importlib loader = _frozen_importlib.ExtensionFileLoader(fullname, filename) module = loader.load_module(fullname) except Exception: # Remove 'fullname' from sys.modules if it was appended there. if fullname in sys.modules: sys.modules.pop(fullname) # Release the interpreter's import lock. imp_unlock() raise # Raise the same exception again. # Release the interpreter's import lock. imp_unlock() return module
def get_filename(self, fullname): """ This method should return the value that __file__ would be set to if the named module was loaded. If the module is not found, then ImportError should be raised. """ # Then, append the appropriate suffix (__init__.pyc for a package, or just .pyc for a module). # Method is_package() will raise ImportError if module not found. if self.is_package(fullname): filename = pyi_os_path.os_path_join(pyi_os_path.os_path_join(SYS_PREFIX, fullname.replace('.', pyi_os_path.os_sep)), '__init__.pyc') else: filename = pyi_os_path.os_path_join(SYS_PREFIX, fullname.replace('.', pyi_os_path.os_sep) + '.pyc') return filename
def load_module(self, fullname, path=None): imp.acquire_lock() try: # PEP302 If there is an existing module object named 'fullname' # in sys.modules, the loader must use that existing module. module = sys.modules.get(fullname) if module is None: filename = pyi_os_path.os_path_join(sys.prefix, fullname + self._suffix) fp = open(filename, 'rb') module = imp.load_module(fullname, fp, filename, self._c_ext_tuple) # Set __file__ attribute. if hasattr(module, '__setattr__'): module.__file__ = filename else: # Some modules (eg: Python for .NET) have no __setattr__ # and dict entry have to be set. module.__dict__['__file__'] = filename except Exception: # Remove 'fullname' from sys.modules if it was appended there. if fullname in sys.modules: sys.modules.pop(fullname) # Release the interpreter's import lock. imp.release_lock() raise # Raise the same exception again. # Release the interpreter's import lock. imp.release_lock() return module
def get_filename(self, fullname): """ This method should return the value that __file__ would be set to if the named module was loaded. If the module is not found, then ImportError should be raised. """ abspath = sys.prefix # Then, append the appropriate suffix (__init__.pyc for a package, or just .pyc for a module). # Method is_package() will raise ImportError if module not found. if self.is_package(fullname): filename = pyi_os_path.os_path_join(pyi_os_path.os_path_join(abspath, fullname.replace('.', pyi_os_path.os_sep)), '__init__.pyc') else: filename = pyi_os_path.os_path_join(abspath, fullname.replace('.', pyi_os_path.os_sep) + '.pyc') return filename
def get_filename(self, fullname): """ This method should return the value that __file__ would be set to if the named module was loaded. If the module is not found, then ImportError should be raised. """ if fullname + self._suffix in self._file_cache: return pyi_os_path.os_path_join(sys.prefix, fullname + self._suffix) else: # ImportError should be raised if module not found. raise ImportError('No module named ' + fullname)
def get_filename(self, fullname): """ This method should return the value that __file__ would be set to if the named module was loaded. If the module is not found, then ImportError should be raised. """ for ext in EXTENSION_SUFFIXES: if fullname + ext in self._file_cache: return pyi_os_path.os_path_join(SYS_PREFIX, fullname + ext) # ImportError should be raised if module not found. raise ImportError('No module named ' + fullname)
def load_module(self, fullname, path=None): """ PEP-302 loader.load_module() method for the ``sys.meta_path`` hook. Return the loaded module (instance of imp.new_module()) or raises an exception, preferably ImportError if an existing exception is not being propagated. """ # Acquire the interpreter's import lock. imp.acquire_lock() module = None try: # PEP302 If there is an existing module object named 'fullname' # in sys.modules, the loader must use that existing module. module = sys.modules.get(fullname) # Module not in sys.modules - load it and it to sys.modules. if module is None: # Load code object from the bundled ZIP archive. is_pkg, bytecode = self._pyz_archive.extract(fullname) # Create new empty 'module' object. module = imp.new_module(fullname) # TODO Replace bytecode.co_filename by something more meaningful: # e.g. /absolute/path/frozen_executable/path/to/module/module_name.pyc # Paths from developer machine are masked. ### Set __file__ attribute of a module relative to the executable # so that data files can be found. The absolute absolute path # to the executable is taken from sys.prefix. In onefile mode it # points to the temp directory where files are unpacked by PyInstaller. abspath = sys.prefix # Then, append the appropriate suffix (__init__.pyc for a package, or just .pyc for a module). if is_pkg: module.__file__ = pyi_os_path.os_path_join(pyi_os_path.os_path_join(abspath, fullname.replace('.', pyi_os_path.os_sep)), '__init__.pyc') else: module.__file__ = pyi_os_path.os_path_join(abspath, fullname.replace('.', pyi_os_path.os_sep) + '.pyc') ### Set __path__ if 'fullname' is a package. # Python has modules and packages. A Python package is container # for several modules or packages. if is_pkg: # If a module has a __path__ attribute, the import mechanism # will treat it as a package. # # Since PYTHONHOME is set in bootloader, 'sys.prefix' points to the # correct path where PyInstaller should find bundled dynamic # libraries. In one-file mode it points to the tmp directory where # bundled files are extracted at execution time. # # __path__ cannot be empty list because 'wx' module prepends something to it. # It cannot contain value 'sys.prefix' because 'xml.etree.cElementTree' fails # Otherwise. # # Set __path__ to point to 'sys.prefix/package/subpackage'. module.__path__ = [pyi_os_path.os_path_dirname(module.__file__)] ### Set __loader__ # The attribute __loader__ improves support for module 'pkg_resources' and # with the frozen apps the following functions are working: # pkg_resources.resource_string(), pkg_resources.resource_stream(). module.__loader__ = self ### Set __package__ # Accoring to PEP302 this attribute must be set. # When it is present, relative imports will be based on this # attribute rather than the module __name__ attribute. # More details can be found in PEP366. # For ordinary modules this is set like: # 'aa.bb.cc.dd' -> 'aa.bb.cc' if is_pkg: module.__package__ = fullname else: module.__package__ = fullname.rsplit('.', 1)[0] ### Add module object to sys.modules dictionary. # Module object must be in sys.modules before the loader # executes the module code. This is crucial because the module # code may (directly or indirectly) import itself; adding it # to sys.modules beforehand prevents unbounded recursion in the # worst case and multiple loading in the best. sys.modules[fullname] = module # Run the module code. exec(bytecode, module.__dict__) except Exception: # Remove 'fullname' from sys.modules if it was appended there. if fullname in sys.modules: sys.modules.pop(fullname) # TODO Do we need to raise different types of Exceptions for better debugging? # PEP302 requires to raise ImportError exception. #raise ImportError("Can't load frozen module: %s" % fullname) # Release the interpreter's import lock. imp.release_lock() raise # Release the interpreter's import lock. imp.release_lock() # Module returned only in case of no exception. return module
def load_module(self, fullname, path=None): """ PEP-302 loader.load_module() method for the ``sys.meta_path`` hook. Return the loaded module (instance of imp.new_module()) or raises an exception, preferably ImportError if an existing exception is not being propagated. """ # Acquire the interpreter's import lock. imp.acquire_lock() module = None try: # PEP302 If there is an existing module object named 'fullname' # in sys.modules, the loader must use that existing module. module = sys.modules.get(fullname) # Module not in sys.modules - load it and it to sys.modules. if module is None: # Load code object from the bundled ZIP archive. is_pkg, bytecode = self._pyz_archive.extract(fullname) # Create new empty 'module' object. module = imp.new_module(fullname) # TODO Replace bytecode.co_filename by something more meaningful: # e.g. /absolute/path/frozen_executable/path/to/module/module_name.pyc # Paths from developer machine are masked. ### Set __file__ attribute of a module relative to the executable # so that data files can be found. The absolute absolute path # to the executable is taken from sys.prefix. In onefile mode it # points to the temp directory where files are unpacked by PyInstaller. abspath = sys.prefix # Then, append the appropriate suffix (__init__.pyc for a package, or just .pyc for a module). if is_pkg: module.__file__ = pyi_os_path.os_path_join( pyi_os_path.os_path_join( abspath, fullname.replace('.', pyi_os_path.os_sep)), '__init__.pyc') else: module.__file__ = pyi_os_path.os_path_join( abspath, fullname.replace('.', pyi_os_path.os_sep) + '.pyc') ### Set __path__ if 'fullname' is a package. # Python has modules and packages. A Python package is container # for several modules or packages. if is_pkg: # If a module has a __path__ attribute, the import mechanism # will treat it as a package. # # Since PYTHONHOME is set in bootloader, 'sys.prefix' points to the # correct path where PyInstaller should find bundled dynamic # libraries. In one-file mode it points to the tmp directory where # bundled files are extracted at execution time. # # __path__ cannot be empty list because 'wx' module prepends something to it. # It cannot contain value 'sys.prefix' because 'xml.etree.cElementTree' fails # Otherwise. # # Set __path__ to point to 'sys.prefix/package/subpackage'. module.__path__ = [ pyi_os_path.os_path_dirname(module.__file__) ] ### Set __loader__ # The attribute __loader__ improves support for module 'pkg_resources' and # with the frozen apps the following functions are working: # pkg_resources.resource_string(), pkg_resources.resource_stream(). module.__loader__ = self ### Set __package__ # Accoring to PEP302 this attribute must be set. # When it is present, relative imports will be based on this # attribute rather than the module __name__ attribute. # More details can be found in PEP366. # For ordinary modules this is set like: # 'aa.bb.cc.dd' -> 'aa.bb.cc' if is_pkg: module.__package__ = fullname else: module.__package__ = fullname.rsplit('.', 1)[0] ### Add module object to sys.modules dictionary. # Module object must be in sys.modules before the loader # executes the module code. This is crucial because the module # code may (directly or indirectly) import itself; adding it # to sys.modules beforehand prevents unbounded recursion in the # worst case and multiple loading in the best. sys.modules[fullname] = module # Run the module code. exec(bytecode, module.__dict__) except Exception: # Remove 'fullname' from sys.modules if it was appended there. if fullname in sys.modules: sys.modules.pop(fullname) # TODO Do we need to raise different types of Exceptions for better debugging? # PEP302 requires to raise ImportError exception. #raise ImportError("Can't load frozen module: %s" % fullname) # Release the interpreter's import lock. imp.release_lock() raise # Release the interpreter's import lock. imp.release_lock() # Module returned only in case of no exception. return module