From: Fuzzyman <fuz...@vo...> - 2006-02-28 10:36:25
|
Hello all, I've encountered a problem with Movable Python and WebWare. Because of the nature of the problem, it probably applies to anyone who attempts to use WebWare with py2exe - or indeed any code that uses ``imp.load_module``. For full details see : http://www.voidspace.org.uk/python/weblog/arch_d7_2006_02_25.shtml#e237 (This has details of a temporary fix to WebWare that gets round the immediate problem.) *Basically*, there is a problem (as far as I can tell) with code that uses ``imp.find_module`` (under py2exe) for modules contained in the ``library.zip``. Because ``find_module`` wants to return an open file as one of it's return values it fails with a ``Module Not Found`` error. For Movable Python I will probably 'monkey patch' ``find_module`` so that it extracts the file and returns it as a cStringIO instance. I wondered if anyone had encountered/solved this problem before, or if there was a better approach ? Thanks Fuzzyman http://www.voidspace.org.uk/python/index.shtml |
From: Thomas H. <th...@py...> - 2006-02-28 20:15:15
|
Fuzzyman wrote: > Hello all, > > I've encountered a problem with Movable Python and WebWare. Because of > the nature of the problem, it probably applies to anyone who attempts to > use WebWare with py2exe - or indeed any code that uses ``imp.load_module``. imp doesn't understand the PEP302 importhook (which zipimport uses). Thomas |
From: Fuzzyman <fuz...@vo...> - 2006-03-01 11:27:11
|
Thomas Heller wrote: > Fuzzyman wrote: >> Hello all, >> >> I've encountered a problem with Movable Python and WebWare. Because >> of the nature of the problem, it probably applies to anyone who >> attempts to use WebWare with py2exe - or indeed any code that uses >> ``imp.load_module``. > > imp doesn't understand the PEP302 importhook (which zipimport uses). > One simple approach would be *something* like (untested) : import imp import marshall from zipimport import zipimporter, ZipImportError from cStringIO import StringIO imp._find_module = imp.find_module def _find_module(name, path=None): try: return imp._find_module(name, path) except ImportError: z = zipimporter(os.path.join(libdir, 'library.zip')) try: code = z.get_code(name) except ZipImportError: raise ImportError # properly construct error here string = marshall.dumps(code) # Add magic number and date to string to make it a valid bytecode file mod = StringIO(string) pathlist = [libdir, 'library.zip'] mod_names = name.split('.') modnames[-1] += '.pyc' pathlist.extend(modnames) pathname = os.path.join(*pathlist) description = ('.pyc', 'rb', 'imp.PY_COMPILED) return (mod, pathname, description) imp.find_module = _find_module This *assumes* that no import path magic is done in ``library.zip`` - i.e. module.package.name equates to the file ``library.zip/module/package/name.pyc``. All the best, Fuzzyman http://www.voidspace.org.uk/python/index.shtml > Thomas > > > > ------------------------------------------------------- > This SF.Net email is sponsored by xPML, a groundbreaking scripting > language > that extends applications into web and mobile media. Attend the live > webcast > and join the prime developer group breaking into this new coding > territory! > http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642 > _______________________________________________ > Py2exe-users mailing list > Py2...@li... > https://lists.sourceforge.net/lists/listinfo/py2exe-users > |
From: Fuzzyman <fuz...@vo...> - 2006-03-01 12:24:26
|
Fuzzyman wrote: > Thomas Heller wrote: >> Fuzzyman wrote: >>> Hello all, >>> >>> I've encountered a problem with Movable Python and WebWare. Because >>> of the nature of the problem, it probably applies to anyone who >>> attempts to use WebWare with py2exe - or indeed any code that uses >>> ``imp.load_module``. >> >> imp doesn't understand the PEP302 importhook (which zipimport uses). >> > One simple approach would be *something* like (untested) : > > import imp > import marshall > from zipimport import zipimporter, ZipImportError > from cStringIO import StringIO > > imp._find_module = imp.find_module > def _find_module(name, path=None): > try: > return imp._find_module(name, path) > except ImportError: > z = zipimporter(os.path.join(libdir, 'library.zip')) > try: > code = z.get_code(name) > except ZipImportError: > raise ImportError # properly construct error here > string = marshall.dumps(code) > # Add magic number and date to string to make it a valid > bytecode file > mod = StringIO(string) > pathlist = [libdir, 'library.zip'] > mod_names = name.split('.') > modnames[-1] += '.pyc' > pathlist.extend(modnames) > pathname = os.path.join(*pathlist) > description = ('.pyc', 'rb', 'imp.PY_COMPILED) > return (mod, pathname, description) > > imp.find_module = _find_module > > This *assumes* that no import path magic is done in ``library.zip`` - > i.e. module.package.name equates to the file > ``library.zip/module/package/name.pyc``. > **damn** I corrected the above code and got the following error when I passed the cStringIO instance to ``imp.load_module`` : Traceback (most recent call last): File "movpy.py", line 1941, in ? File "zip_imp.py", line 61, in ? ValueError: load_module arg#2 should be a file or None load_module expects a real file instance, and won't accept a cStringIO instance. *sigh* I'll probably have to patch that as well. All the best, Fuzzyman http://www.voidspace.org.uk/python/index.shtml |
From: Fuzzyman <fuz...@vo...> - 2006-03-01 13:10:30
Attachments:
zip_imp.py
|
Hello all, Here it is, in all its ungainly glory. Improvements solicited. :-) This is a version of ``imp.find_module`` that works with py2exe. It works by patching ``imp`` with a modified version of ``find_module``. It creates a real temporary file that will work with ``imp.find_module``. It has a ``cleanup`` function to delete any temporary files created, you should call this at the end of your code. Save it as a module called ``zip_imp.py``. At the start of your program do : from zip_imp import cleanup # .. code which possibly calls imp.find_module cleanup() All the best, Fuzzyman http://www.voidspace.org.uk/python/index.shtml |
From: Fuzzyman <fuz...@vo...> - 2006-03-01 15:21:10
|
Fuzzyman wrote: > Thomas Heller wrote: >> Fuzzyman wrote: >>> Hello all, >>> >>> I've encountered a problem with Movable Python and WebWare. Because >>> of the nature of the problem, it probably applies to anyone who >>> attempts to use WebWare with py2exe - or indeed any code that uses >>> ``imp.load_module``. >> >> imp doesn't understand the PEP302 importhook (which zipimport uses). >> > One simple approach would be *something* like (untested) : > > [snip..] My apologies for all the emails folks. I have to stop thinking aloud. Although the module I posted previously works fine for Movable Python there are a couple of minor issues making it unsuitable as a 'general' solution. I've posted updated code to my blog : http://www.voidspace.org.uk/python/weblog/arch_d7_2006_02_25.shtml#e241 As I say there, improved suggestions are welcomed. This seems to work though. It should also behave normally in code that hasn't yet been frozen. All the best, Fuzzyman http://www.voidspace.org.uk/python/index.shtml |