Hello, I was hoping that this problem might have been magically solved when I was on holiday ;)
I've come up with a hack/fix which works consistently for me using tg2exe. I can't however do anything to get py2exe to work properly with turbogears. The problem seems to be with the "easy_install.pth" on my system. All entries in it mention filenames that are lower case. When the "pkg_resources.py" looked for packages it did not find TurboGears and other filenames as the exact package couldn't be found. This only seems to be a problem with when I run the python that tg2exe gathers together. The system installed python doesn't suffer from this problem. I really don't know why this should be the case. Could this be a bug in setuptools that hasn't occurred before? The hack solution for tg2exe: * Decompress eggs in the system site-packages dir so there are no eggs in zip format. * tg-admin makexe * Open the "dist\Lib\site-packages" * Delete the modules tg-admin makexe has gathered that we wil use eggs for: cherrypy, dispatch, elementtree, formencode, kid, paste, protocols, py2exe, setuptools, simplejson, turbogears, turbojson * Copy in the eggs (in zip format download from tg site): Cheetah-1.0-py2.4-win32.egg CherryPy-2.2.1-py2.4.egg DOMinclude-1.0-py2.4.egg LightBox-2.0-py2.4.egg Paste-0.9.7-py2.4.egg PasteDeploy-0.9.6-py2.4.egg PyProtocols-1.0a0dev_r2082-py2.4-win32.egg ruledispatch-0.5a0.dev_r2115-py2.4-win32.egg SQLObject-0.7.1dev_r1860-py2.4.egg TurboGears-1.0.1-py2.4.egg TurboJson-1.0-py2.4.egg TurboKid-0.9.8-py2.4.egg cElementTree-1.0.5_20051216-py2.4-win32.egg configobj-4.3.2-py2.4.egg elementtree-1.2.6-py2.4.egg kid-0.9.3-py2.4.egg simplejson-1.3-py2.4.egg setuptools-0.6c5-py2.4.egg FormEncode-0.6-py2.4.egg PasteScript-1.1-py2.4.egg TurboCheetah-0.9.5-py2.4.egg * Create the easy_install.pth, making sure the case is correct: import sys; sys.__plen = len(sys.path) ./Cheetah-1.0-py2.4-win32.egg ./CherryPy-2.2.1-py2.4.egg ./DOMinclude-1.0-py2.4.egg ./LightBox-2.0-py2.4.egg ./Paste-0.9.7-py2.4.egg ./PasteDeploy-0.9.6-py2.4.egg ./PyProtocols-1.0a0dev_r2082-py2.4-win32.egg ./ruledispatch-0.5a0.dev_r2115-py2.4-win32.egg ./SQLObject-0.7.1dev_r1860-py2.4.egg ./TurboGears-1.0.1-py2.4.egg ./TurboJson-1.0-py2.4.egg ./TurboKid-0.9.8-py2.4.egg ./cElementTree-1.0.5_20051216-py2.4-win32.egg ./configobj-4.3.2-py2.4.egg ./elementtree-1.2.6-py2.4.egg ./kid-0.9.3-py2.4.egg ./simplejson-1.3-py2.4.egg ./setuptools-0.6c5-py2.4.egg ./FormEncode-0.6-py2.4.egg ./PasteScript-1.1-py2.4.egg ./TurboCheetah-0.9.5-py2.4.egg import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p +len(new) * Copy the prod.cfg into the dist dir. * from the dist dir try running the script ./python.exe start-tgpy2exe.pyc [EMAIL PROTECTED] [dist]> ./python.exe start-tgpy2exe.pyc Traceback (most recent call last): File ".\start-tgpy2exe.py", line 26, in ? File "z:\aam\tgpy2exe\dist\lib\site-packages\TurboGears-1.0.1- py2.4.egg\turbogears\startup.py", li ne 300, in start_server File "z:\aam\tgpy2exe\dist\lib\site-packages\CherryPy-2.2.1-py2.4.egg \cherrypy\_cpserver.py", line 72, in start File "z:\aam\tgpy2exe\dist\lib\site-packages\CherryPy-2.2.1-py2.4.egg \cherrypy\_cpengine.py", line 104, in start File "z:\aam\tgpy2exe\dist\lib\site-packages\CherryPy-2.2.1-py2.4.egg \cherrypy\_cpserver.py", line 76, in _start File "z:\aam\tgpy2exe\dist\lib\site-packages\CherryPy-2.2.1-py2.4.egg \cherrypy\_cpengine.py", line 76, in setup File "z:\aam\tgpy2exe\dist\lib\site-packages\CherryPy-2.2.1-py2.4.egg \cherrypy\filters\__init__.py ", line 66, in init File "z:\aam\tgpy2exe\dist\lib\site-packages\CherryPy-2.2.1-py2.4.egg \cherrypy\lib\cptools.py", li ne 226, in attributes File "z:\aam\tgpy2exe\dist\lib\site-packages\CherryPy-2.2.1-py2.4.egg \cherrypy\lib\cptools.py", li ne 215, in modules File "z:\aam\tgpy2exe\dist\lib\site-packages\CherryPy-2.2.1-py2.4.egg \cherrypy\filters\xmlrpcfilte r.py", line 84, in ? ImportError: No module named xmlrpclib [EMAIL PROTECTED] [dist]> * copy the missing xmlrpclib.pyc into dist/Lib * Retry, hop to localhost:8080, ta-da... * Done All the best, Oisin Oisin Mulvihill wrote: > I'm currently tracking it down. > > It looks like pkg_resources isn't finding turbogears when its looking > for packages in the dist/Lib/site-packages directory. Turbogears is > there. If you do import turbogears you see its imported it its just the > call to require inside turbogears startup that isn't finding itself. Copying > the egg file in doesn't solve the problem at the moment. More prints > are still needed. > > I don't think I'll get this sorted before I go on holiday tomorrow, maybe > next week sometime :( > > All the best, > > Oisin > > > Diego wrote: >> I wonder if you were able to resolve the problem. >> I'm getting the same error after using tg2exe: >> pkg_resources.DistributionNotFound: TurboGears >> >> Thanks, >> >> Diego >> >> Oisin Mulvihill wrote: >> >>> Hello, >>> >>> I've asked a similar question on the py2exe mailing list >>> (http://sourceforge.net/mailarchive/message.php?msg_id=37995269) >>> without any response. So I'm trying a revised version here instead. >>> >>> Has anyone actually produced a turbogears app as an exe/standalone >>> distro which can then be installed via inno? >>> If so could I get a look at your setup.py / build script / magic system >>> you used to do this? >>> >>> Any help on this would be really welcomed as I've spent a week banging >>> my head against the wall, with very little >>> beneficial affect. >>> >>> What I've tried: >>> >>> 1. tg2exe: >>> >>> Appears to gather everything together without errors. However on >>> running the app I just >>> keep getting the error: >>> >>> [EMAIL PROTECTED] [dist]> ./python.exe start-tgpy2exe.pyc >>> >>> Traceback (most recent call last): >>> File ".\start-tgpy2exe.py", line 5, in ? >>> File "dist\Lib\site-packages\turbogears\__init__.py", line 8, in ? >>> File "dist\Lib\site-packages\turbogears\widgets\__init__.py", line 1, >>> in ? >>> File "dist\Lib\site-packages\turbogears\widgets\base.py", line 5, in >>> ? >>> File "dist\Lib\site-packages\turbogears\startup.py", line 24, in ? >>> File "dist\Lib\site-packages\pkg_resources.py", line 585, in require >>> File "dist\Lib\site-packages\pkg_resources.py", line 483, in resolve >>> pkg_resources.DistributionNotFound: TurboGears >>> [EMAIL PROTECTED] [dist]> >>> >>> >>> 2. Manually specifying all modules in py2exe: >>> >>> I was talking to a friend and he suggested specifying the modules by >>> hand in py2exe. I gave this a go >>> without success. This was what I ended up with when I first tried using >>> py2exe. Manually specifying >>> linecache makes no difference: >>> >>> [EMAIL PROTECTED] [dist]> ./WebPresence.exe >>> Traceback (most recent call last): >>> File >>> "c:\Python24\lib\site-packages\py2exe-0.6.6-py2.4-win32.egg\py2exe\boot_common.py", >>> line 92, >>> in ? >>> import linecache >>> ImportError: No module named linecache >>> Traceback (most recent call last): >>> File "start-tgpy2exe.py", line 2, in ? >>> ImportError: No module named pkg_resources >>> [EMAIL PROTECTED] [dist]> >>> >>> >>> 3. Trying non-egg installs of the dependancies: >>> >>> This isn't really a runner as turbogears needs setuptools and I had to >>> do some code >>> hacks to the dependancies. When I tried this approach I ended up back >>> at the >>> turbogears not found message I got using tg2exe. >>> >>> 4. cx_freeze: >>> >>> This was a last resort. I couldn't really find any examples of people >>> trying this >>> with turbogears. I built the exe although running it produced the >>> error: >>> >>> [EMAIL PROTECTED] [tgpy2exe]> ./start-tgpy2exe.exe >>> Traceback (most recent call last): >>> File "c:\cx_Freeze-3.0.3\initscripts\console.py", line 27, in ? >>> exec code in m.__dict__ >>> File "start-tgpy2exe.py", line 5, in ? >>> from turbogears import update_config, start_server >>> File >>> "C:\Python24\lib\site-packages\turbogears-1.0-py2.4.egg\turbogears\__init__.py", >>> line 6, in ? >>> >>> from turbogears.controllers import expose, flash, validate, >>> redirect, \ >>> File >>> "C:\Python24\lib\site-packages\turbogears-1.0-py2.4.egg\turbogears\controllers.py", >>> line 12, >>> in ? >>> from turbogears import view, database, errorhandling, config >>> File >>> "C:\Python24\lib\site-packages\turbogears-1.0-py2.4.egg\turbogears\view\__init__.py", >>> line 1, >>> in ? >>> from turbogears.view.base import * >>> File >>> "C:\Python24\lib\site-packages\turbogears-1.0-py2.4.egg\turbogears\view\base.py", >>> line 17, in >>> ? >>> from turbogears.i18n import i18n_filter, get_locale >>> File >>> "C:\Python24\lib\site-packages\turbogears-1.0-py2.4.egg\turbogears\i18n\__init__.py", >>> line 5, >>> in ? >>> from turbogears.i18n.tg_gettext import gettext, ngettext, install, >>> is_locale_supported, \ >>> File >>> "C:\Python24\lib\site-packages\turbogears-1.0-py2.4.egg\turbogears\i18n\tg_gettext.py", >>> line >>> 4, in ? >>> from turbojson.jsonify import jsonify >>> File >>> "C:\Python24\lib\site-packages\turbojson-1.0-py2.4.egg\turbojson\jsonify.py", >>> line 6, in ? >>> from simplejson import JSONEncoder >>> File "C:\Python24\lib\site-packages\simplejson\__init__.py", line 80, >>> in ? >>> from decoder import JSONDecoder >>> File "C:\Python24\lib\site-packages\simplejson\decoder.py", line 19, >>> in ? >>> NaN, PosInf, NegInf = _floatconstants() >>> File "C:\Python24\lib\site-packages\simplejson\decoder.py", line 13, >>> in _floatconstants >>> _BYTES = '7FF80000000000007FF0000000000000'.decode('hex') >>> LookupError: unknown encoding: hex >>> [EMAIL PROTECTED] [tgpy2exe]> >>> >>> I really don't know where to go from here :( >>> >>> >>> 5. Forcing the customers to use linux. >>> >>> The ideal solution, but sadly not an option where this app will get >>> deployed... >>> >>> >>> My system Info: >>> >>> * python2.4 running on windows xp. >>> * py2exe 0.6.6 (installed via easy_install). >>> * turbogears 1.0 (installed via easy_install). >>> * build being run in cygwin (I'm not using its python). >>> >>> >>> My current monster/abomination setup.py: >>> >>> # >>> # I'm following/implementing the rough approach here: >>> http://www.py2exe.org/index.cgi/ExeWithEggs >>> # >>> # 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 >>> # >>> # >>> import os >>> import sys >>> import zipfile >>> import subprocess >>> >>> # will this fix the missing linecache? nope... >>> import linecache >>> >>> # setuptools must be imported first before py2exe >>> import setuptools >>> import py2exe >>> from setuptools import setup, find_packages >>> from turbogears.finddata import find_package_data >>> >>> >>> execfile(os.path.join("tgpy2exe", "release.py")) >>> >>> >>> # Here's steps 1 and 2: >>> import pkg_resources >>> from setuptools.archive_util import unpack_archive >>> >>> eggdir = r"c:\Python24\Lib\site-packages" >>> >>> eggs = pkg_resources.require("TurboGears") >>> >>> for egg in eggs: >>> if os.path.isdir(egg.location): >>> sys.path.insert(0, egg.location) >>> continue >>> unpack_archive(egg.location, eggdir) >>> >>> eggfiledirs = [] >>> 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")) >>> eggfiledirs.append(egg.location) >>> eggspth.close() >>> eggpacks.remove("pkg_resources") >>> >>> >>> >>> class WebPresenceTarget(object): >>> """Standalone exe for testing. >>> """ >>> def __init__(self): >>> self.name = 'Web Presence' >>> self.script = 'start-tgpy2exe.py' >>> self.dest_base = 'WebPresence' >>> self.description='Web Presence for the xyz system (exe)' >>> >>> data = find_package_data(where='tgpy2exe', package='tgpy2exe') >>> >>> >>> # A failed attempt at step 3. >>> data_files = [ >>> # >>> # Find package data didn't work, it seems to look for stuff >>> # not part of the package: >>> # >>> # *** copy data files *** >>> # creating z:\aam\tgpy2exe\dist\turbogears >>> # error: can't copy 'turbogears.win32com.test': doesn't exist or >>> not a regular file >>> # >>> # ('turbogears', find_package_data(where=eggdir, >>> package='turbogears')), >>> # >>> ] >>> >>> opts = { >>> "py2exe": { >>> "compressed": 1, >>> "optimize": 2, >>> "ascii": 1, >>> "bundle_files": 2, >>> "includes": [ >>> "kid", >>> "linecache", >>> "paste", >>> "cherrypy", >>> "configobj", >>> "formencode", >>> "turbogears", >>> "turbocheetah", >>> "turbojson", >>> "turbokid", >>> "cElementTree", >>> "simplejson", >>> "pywin", >>> # "pyprotocols", >>> "elementtree", >>> "mx", >>> "isapi", >>> "win32com", >>> # "ruledispatch", >>> "setuptools", >>> # "pastescript", >>> # "cheetah", >>> # "pastedeploy", >>> # "cheetah", >>> "elementtree", >>> "mx.DateTime", >>> "pkg_resources", >>> "encodings.hex_codec", >>> ], >>> "packages" : [ >>> "turbogears", >>> ] >>> } >>> } >>> >>> >>> >>> # Step 4. >>> setup( >>> name="tgpy2exe", >>> >>> options = opts, >>> >>> version=version, >>> >>> console = [ >>> WebPresenceTarget(), >>> ], >>> >>> packages=find_packages(), >>> >>> data_files = data_files, >>> >>> package_data = data, >>> ) >>> >>> >>> #sys.exit(0) >>> >>> >>> >>> # Step 5: >>> import zipfile >>> >>> oldzipfile = "dist/library.zip" >>> newzipfile = "dist/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) >>> >>> >>> >>> # My attempt at getting round step 3 by just copying in the >>> # missing egg files directly. >>> # >>> # Add the required egg files (cygwin needed) to the library >>> # zip file, not the best approach: >>> # >>> # >>> def c(cmds, **opts): >>> for cmd in cmds: >>> print cmd >>> app_process = subprocess.Popen( >>> args=cmd, >>> shell=True, >>> **opts >>> ) >>> out, err = app_process.communicate() >>> print "%s %s" % (out or "", err or "") >>> >>> if app_process.returncode > 0: >>> print "Error: return code %s " % app_process.returncode >>> sys.exit(1) >>> >>> >>> cmds = [ >>> "unzip -o dist/library.zip -d dist/library", >>> "rm -f dist/library.zip", >>> ] >>> c(cmds) >>> >>> >>> # Copy the decompressed egg directories: >>> for file_or_dir in eggfiledirs: >>> c(["cp -r %s dist/library" % file_or_dir]) >>> >>> >>> # Copy required setuptools, for the pkg_resources, so the eggs can be >>> found: >>> cmds = [ >>> "cp -r %s\setuptools-0.6c5-py2.4.egg dist/library" % eggdir, >>> "cp -r %s\setuptools.pth dist/library" % eggdir, >>> "cp -r %s\easy-install.pth dist/library" % eggdir, >>> ] >>> c(cmds) >>> >>> >>> # Rebuild the library with the updated content: >>> c(["zip -qr library.zip *"], cwd="dist") >>> >>> >>> >>> >>> All the best, >>> >>> Oisin >>> >> >> >> > > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "TurboGears" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/turbogears?hl=en -~----------~----~----~----~------~----~------~--~---

