Phillip suggested that this would be a good addition to the py2exe wiki, but it appears that the py2exe wiki is closed off. This message is my recipe for using py2exe (and py2app with basically the same code) with eggs.
Kevin ---------- Forwarded message ---------- From: Kevin Dangoor <[EMAIL PROTECTED]> Date: Oct 20, 2005 9:20 PM Subject: Re: [TurboGears] TurboGears and py2exe To: [email protected] This is cut from a couple spots in my script. The basic flow is: 1. unpack zipped eggs, because I believe py2exe chokes on them when resolving dependencies 2. keep track of the top level packages in the eggs 3. add all of the files in the eggs to the data_files, so that the eggs are installed along side the main exe 4. build the exe 5. generate a new library.zip that does not include anything in the top level packages found in step 2 here's steps 1 and 2: import pkg_resources eggs = pkg_resources.require("TurboGears") from setuptools.archive_util import unpack_archive for egg in eggs: if os.path.isdir(egg.location): sys.path.insert(0, egg.location) continue unpack_archive(egg.location, eggdir) eggpacks = set() eggspth = open("build/eggs.pth", "w") for egg in eggs: print egg eggspth.write(os.path.basename(egg.location)) eggspth.write("\n") eggpacks.update(egg.get_metadata_lines("top_level.txt")) eggspth.close() eggpacks.remove("pkg_resources") and here's step 5: import zipfile oldzipfile = "dist/exe/library.zip" newzipfile = "dist/exe/small-library.zip" oldzip = zipfile.ZipFile(oldzipfile, "r") newzip = zipfile.ZipFile(newzipfile, "w", zipfile.ZIP_STORED) for entry in oldzip.infolist(): delim = entry.filename.find("/") if delim == -1: delim = entry.filename.find(".") if delim > -1: if entry.filename[0:delim] in eggpacks: print "Skipping %s, it's in the egg" % (entry.filename) continue newzip.writestr(entry, oldzip.read(entry.filename)) newzip.close() oldzip.close() os.remove(oldzipfile) os.rename(newzipfile, oldzipfile) As I mentioned in that thread from August, this is ugly and it would be nice to fix... the only plus to going this route over fixing it properly was that this route works for both py2exe and py2app. Fixing it properly would've required me to dive into both of those packages. Kevin -- Kevin Dangoor Author of the Zesty News RSS newsreader email: [EMAIL PROTECTED] company: http://www.BlazingThings.com blog: http://www.BlueSkyOnMars.com -- Kevin Dangoor Author of the Zesty News RSS newsreader email: [EMAIL PROTECTED] company: http://www.BlazingThings.com blog: http://www.BlueSkyOnMars.com _______________________________________________ Distutils-SIG maillist - [email protected] http://mail.python.org/mailman/listinfo/distutils-sig
