From: <th...@us...> - 2014-10-15 17:42:04
|
Revision: 758 http://sourceforge.net/p/py2exe/svn/758 Author: theller Date: 2014-10-15 17:41:56 +0000 (Wed, 15 Oct 2014) Log Message: ----------- set svn:eol-style to native. Modified Paths: -------------- trunk/py2exe-3/zipextimporter.py Property Changed: ---------------- trunk/py2exe-3/zipextimporter.py Modified: trunk/py2exe-3/zipextimporter.py =================================================================== --- trunk/py2exe-3/zipextimporter.py 2014-09-24 17:47:51 UTC (rev 757) +++ trunk/py2exe-3/zipextimporter.py 2014-10-15 17:41:56 UTC (rev 758) @@ -1,128 +1,128 @@ -r"""zipextimporter - an importer which can import extension modules -from zipfiles without unpacking them to the file system. - -This file and _memimporter.pyd is part of the py2exe package. - -Overview -======== - -zipextimporter.py contains the ZipExtImporter class which allows to -load Python binary extension modules contained in a zip.archive, -without unpacking them to the file system. - -Call the zipextimporter.install() function to install the import hook, -add a zip-file containing .pyd or .dll extension modules to sys.path, -and import them. - -It uses the _memimporter extension which uses code from Joachim -Bauch's MemoryModule library. This library emulates the win32 api -function LoadLibrary. - -Sample usage -============ - -You have to prepare a zip-archive 'lib.zip' containing -your Python's _socket.pyd for this example to work. - ->>> import zipextimporter ->>> zipextimporter.install() ->>> import sys ->>> sys.path.insert(0, "lib.zip") ->>> import _socket ->>> print(_socket) -<module '_socket' from 'lib.zip\_socket.pyd'> ->>> _socket.__file__ -'lib.zip\\_socket.pyd' ->>> _socket.__loader__ -<ZipExtensionImporter object 'lib.zip'> ->>> # Reloading also works correctly: ->>> _socket is reload(_socket) -True ->>> - -""" -import imp -import sys -import zipimport - -# _memimporter is a module built into the py2exe runstubs. -import _memimporter - -class ZipExtensionImporter(zipimport.zipimporter): - _suffixes = [s[0] for s in imp.get_suffixes() if s[2] == imp.C_EXTENSION] - - def find_loader(self, fullname): - """We need to override this method for Python 3.x. - """ - loader, portions = super().find_loader(fullname) - if loader is None: - pathname = fullname.replace(".", "\\") - for s in self._suffixes: - if (pathname + s) in self._files: - return self, [] - return None, [] - return loader, portions - - def find_module(self, fullname, path=None): - result = zipimport.zipimporter.find_module(self, fullname, path) - if result: - return result - fullname = fullname.replace(".", "\\") - for s in self._suffixes: - if (fullname + s) in self._files: - return self - return None - - def load_module(self, fullname): - verbose = _memimporter.get_verbose_flag() - if fullname in sys.modules: - mod = sys.modules[fullname] - if verbose: - sys.stderr.write( - "import %s # previously loaded from zipfile %s\n" - % (fullname, self.archive)) - return mod - try: - return zipimport.zipimporter.load_module(self, fullname) - except Exception: - pass - if sys.version_info >= (3, 0): - # name of initfunction - initname = "PyInit_" + fullname.split(".")[-1] - else: - # name of initfunction - initname = "init" + fullname.split(".")[-1] - filename = fullname.replace(".", "\\") - if filename in ("pywintypes", "pythoncom"): - filename = filename + "%d%d" % sys.version_info[:2] - suffixes = ('.dll',) - else: - suffixes = self._suffixes - for s in suffixes: - path = filename + s - if path in self._files: - if verbose > 1: - sys.stderr.write("# found %s in zipfile %s\n" - % (path, self.archive)) - mod = _memimporter.import_module(fullname, path, - initname, - self.get_data) - mod.__file__ = "%s\\%s" % (self.archive, path) - mod.__loader__ = self - if verbose: - sys.stderr.write("import %s # loaded from zipfile %s\n" - % (fullname, mod.__file__)) - return mod - raise zipimport.ZipImportError("can't find module %s" % fullname) - - def __repr__(self): - return "<%s object %r>" % (self.__class__.__name__, self.archive) - -def install(): - "Install the zipextimporter" - sys.path_hooks.insert(0, ZipExtensionImporter) - # Not sure if this is needed... - sys.path_importer_cache.clear() - ## # Not sure if this is needed... - ## import importlib - ## importlib.invalidate_caches() +r"""zipextimporter - an importer which can import extension modules +from zipfiles without unpacking them to the file system. + +This file and _memimporter.pyd is part of the py2exe package. + +Overview +======== + +zipextimporter.py contains the ZipExtImporter class which allows to +load Python binary extension modules contained in a zip.archive, +without unpacking them to the file system. + +Call the zipextimporter.install() function to install the import hook, +add a zip-file containing .pyd or .dll extension modules to sys.path, +and import them. + +It uses the _memimporter extension which uses code from Joachim +Bauch's MemoryModule library. This library emulates the win32 api +function LoadLibrary. + +Sample usage +============ + +You have to prepare a zip-archive 'lib.zip' containing +your Python's _socket.pyd for this example to work. + +>>> import zipextimporter +>>> zipextimporter.install() +>>> import sys +>>> sys.path.insert(0, "lib.zip") +>>> import _socket +>>> print(_socket) +<module '_socket' from 'lib.zip\_socket.pyd'> +>>> _socket.__file__ +'lib.zip\\_socket.pyd' +>>> _socket.__loader__ +<ZipExtensionImporter object 'lib.zip'> +>>> # Reloading also works correctly: +>>> _socket is reload(_socket) +True +>>> + +""" +import imp +import sys +import zipimport + +# _memimporter is a module built into the py2exe runstubs. +import _memimporter + +class ZipExtensionImporter(zipimport.zipimporter): + _suffixes = [s[0] for s in imp.get_suffixes() if s[2] == imp.C_EXTENSION] + + def find_loader(self, fullname): + """We need to override this method for Python 3.x. + """ + loader, portions = super().find_loader(fullname) + if loader is None: + pathname = fullname.replace(".", "\\") + for s in self._suffixes: + if (pathname + s) in self._files: + return self, [] + return None, [] + return loader, portions + + def find_module(self, fullname, path=None): + result = zipimport.zipimporter.find_module(self, fullname, path) + if result: + return result + fullname = fullname.replace(".", "\\") + for s in self._suffixes: + if (fullname + s) in self._files: + return self + return None + + def load_module(self, fullname): + verbose = _memimporter.get_verbose_flag() + if fullname in sys.modules: + mod = sys.modules[fullname] + if verbose: + sys.stderr.write( + "import %s # previously loaded from zipfile %s\n" + % (fullname, self.archive)) + return mod + try: + return zipimport.zipimporter.load_module(self, fullname) + except Exception: + pass + if sys.version_info >= (3, 0): + # name of initfunction + initname = "PyInit_" + fullname.split(".")[-1] + else: + # name of initfunction + initname = "init" + fullname.split(".")[-1] + filename = fullname.replace(".", "\\") + if filename in ("pywintypes", "pythoncom"): + filename = filename + "%d%d" % sys.version_info[:2] + suffixes = ('.dll',) + else: + suffixes = self._suffixes + for s in suffixes: + path = filename + s + if path in self._files: + if verbose > 1: + sys.stderr.write("# found %s in zipfile %s\n" + % (path, self.archive)) + mod = _memimporter.import_module(fullname, path, + initname, + self.get_data) + mod.__file__ = "%s\\%s" % (self.archive, path) + mod.__loader__ = self + if verbose: + sys.stderr.write("import %s # loaded from zipfile %s\n" + % (fullname, mod.__file__)) + return mod + raise zipimport.ZipImportError("can't find module %s" % fullname) + + def __repr__(self): + return "<%s object %r>" % (self.__class__.__name__, self.archive) + +def install(): + "Install the zipextimporter" + sys.path_hooks.insert(0, ZipExtensionImporter) + # Not sure if this is needed... + sys.path_importer_cache.clear() + ## # Not sure if this is needed... + ## import importlib + ## importlib.invalidate_caches() Property changes on: trunk/py2exe-3/zipextimporter.py ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |