|
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: TurboGearsThanks, 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 = "" 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 -~----------~----~----~----~------~----~------~--~--- |
- [TurboGears] Re: problem using py2exe with turbogears (and... Oisin Mulvihill
- [TurboGears] Re: problem using py2exe with turbogears... Oisin Mulvihill

