Re: [cx-freeze-users] cx_Freeze doesn't use compression for zipfiles
Brought to you by:
atuining
From: Anthony T. <ant...@gm...> - 2005-06-15 17:45:22
|
I'll take a look into this when I get a chance. Thanks for pointing it out. On 6/7/05, Ralf Schmitt <ra...@br...> wrote: > Ralf Schmitt wrote: > > In Freezer.py the zipfile is created with > > compression=3Dzipfile.ZIP_DEFLATED. But the zipfile module doesn't > > compress members added with writestr if they don't have the right > > 'compress_type' (at least when using python 2.4). Guess this isn't > > intended behaviour. > > >=20 > Of course, turning on zipfile compression, doesn't work without > problems. One needs the zlib module, and even if it is installed, the > frozen executable sometimes can't load it, and sometimes can load it, > depending on the way the frozen executable is called. This is a problem > with sys.path not being cleared before the initscript being called, > maybe it should even be fixed, if one doesn't use zipfile compression. > The attached patch solves that problem for me. >=20 > - Ralf >=20 >=20 >=20 >=20 > Index: Console.c > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- Console.c (revision 17719) > +++ Console.c (revision 17745) > @@ -53,11 +53,29 @@ > Py_Initialize(); > PySys_SetArgv(argc, argv); >=20 > + // PyRun_SimpleString("import sys; print 'sys.path after PySys_SetAr= gv:', sys.path"); > + > + // sys.path isn't as empty as one might hope. when using zipfile com= pression > + // the zlib module must be loaded. without cleaning sys.path here, i= t did happen > + // that trying to run a frozen executable sometimes did, and sometim= es did not find > + // zlib depending on the way you called the frozen executable (i.e. = 'dist/foobar' > + // vs 'foobar'). When cleaning sys.path with the following code, it = will always > + // fail :) > + > + if (PyRun_SimpleString("import sys; del sys.path[:]")) { > + goto error; > + } > + > // do the work > - if (ExecuteScript(fileName) < 0) > - return 1; > + if (ExecuteScript(fileName) < 0) { > + goto error; > + } >=20 > Py_Finalize(); > return 0; > + > + error: > + Py_Finalize(); > + return 1; > } >=20 > Index: Freezer.py > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- Freezer.py (revision 17719) > +++ Freezer.py (revision 17745) > @@ -72,7 +72,7 @@ > return os.path.join(baseDir, subDir, name + ext) >=20 >=20 > -def Freeze(targetFileName, moduleFinder, zipIncludes): > +def Freeze(targetFileName, moduleFinder, zipIncludes, useCompression=3DT= rue): > """Freeze the modules found by the finder to the end of the file.""" > outFile =3D zipfile.PyZipFile(targetFileName, "a", zipfile.ZIP_DEFLA= TED) > mods =3D [] > @@ -95,7 +95,8 @@ > data =3D imp.get_magic() + struct.pack("<i", mtime) + \ > marshal.dumps(module.__code__) > zinfo =3D zipfile.ZipInfo(fileName + ".pyc", zipTime) > - zinfo.compress_type =3D zipfile.ZIP_DEFLATED > + if useCompression: > + zinfo.compress_type =3D zipfile.ZIP_DEFLATED > outFile.writestr(zinfo, data) > for spec in zipIncludes: > if '=3D' in spec: > Index: mycxfreeze.py > Index: Common.c > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- Common.c (revision 17719) > +++ Common.c (revision 17745) > @@ -6,6 +6,16 @@ > #include <compile.h> > #include <eval.h> >=20 > +#include <limits.h> > + > +#ifdef HAVE_SYS_PARAM_H > +#include <sys/param.h> > +#endif > + > +#ifdef HAVE_STDLIB_H > +#include <stdlib.h> > +#endif > + > //----------------------------------------------------------------------= ------- > // ExecuteScript() > // Execute the script found within the file. > @@ -15,6 +25,10 @@ > { > PyObject *module, *importer, *code, *dict, *pathList, *temp; > int result; > + const char *resolved_path =3D fileName; > +#ifdef HAVE_REALPATH > + static char buffer[PATH_MAX+1]; > +#endif >=20 > #ifdef __WIN32__ > char dllName[PATH_MAX + 1]; > @@ -41,6 +55,13 @@ > return FatalError("cannot set dll name in module sys"); > #endif >=20 > +#ifdef HAVE_REALPATH > + if (realpath(fileName, buffer)) { > + resolved_path =3D buffer; > + } > +#endif > + > + > // add the file to sys.path > pathList =3D PySys_GetObject("path"); > if (!pathList) > @@ -53,6 +74,24 @@ > if (result < 0) > return FatalError("cannot insert file name in sys.path"); >=20 > + temp =3D PyString_FromString(resolved_path); > + if (!temp) > + return FatalError("cannot create Python string"); > + PySys_SetObject("realexecutable", temp); > + Py_DECREF(temp); > + > + > + if (PyRun_SimpleString( > + "import sys\n" > + "sep =3D sys.platform=3D=3D'win32' and '\\\\' or '/'\n" > + "sys.path.append(sys.realexecutable[:sys.realexecutable.r= find(sep)])\n" > + // "del sys.realexecutable\n" > + //"print sys.path, sys.executable, sys.realexecutable\n" > + )) { > + // error > + return -1; > + } > + > // load and execute initscript > module =3D PyImport_ImportModule("zipimport"); > if (!module) > Index: initscripts/MyConsole.py > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- initscripts/MyConsole.py (revision 17719) > +++ initscripts/MyConsole.py (revision 17745) > @@ -6,19 +6,11 @@ > # the Win32 extensions behave as expected. > #-----------------------------------------------------------------------= ------- >=20 > -import os > import sys > -import warnings > +import os > import zipimport >=20 > -fileName =3D sys.path[0] > -while os.path.islink(fileName): > - fileName =3D os.path.normpath(os.path.join(os.path.dirname(fileName)= , > - os.readlink(fileName))) > -dirName =3D os.path.dirname(fileName) > - > sys.frozen =3D True > -sys.path =3D [fileName, dirName] >=20 > try: > import encodings > @@ -30,8 +22,7 @@ > exe =3D exe[:-4] >=20 > m =3D __import__("__main__") > -importer =3D zipimport.zipimporter(fileName) > +importer =3D zipimport.zipimporter(sys.executable) > code =3D importer.get_code("__main__%s__" % exe) > m.__dict__['__file__'] =3D exe > exec code in m.__dict__ > - >=20 >=20 > |