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
-~----------~----~----~----~------~----~------~--~---

Reply via email to