Hello,
I see no one has come up with a fix to the
"pkg_resources.DistributionNotFound: TurboGears" problem.
I was hoping to come back from holiday and it would magically be fixed
:(
I've come up with a hack solution that makes the "tg-admin makexe" work
for me. I still can't make
py2exe work however.
The basic problem seems to be the "easy_install.pth" that gets put into
the dist/Lib/site-packages. On
my system, the file contained the file names for the eggs in non-case
sensitive form. i.e the file names
were all lower case. This meant that TurboGears wasn't being registered
and picked up by
setuptool's "pkg_resources.py"
The following hack process works for me currently, but its far from
ideal. What is interesting is that the
easy_install.pth (with all lowercase filenames) works in the standard
system installed python, but not
in the packaged tg2exe version.
Maybe now I can py2exe the working tg2exe distro...
The hack fix:
* tg-admin makexe
* Open the "dist\Lib\site-packages"
* Delete the modules tg-admin has created for the turbogears project.
There
is no point having these around as well as the egg version.
cherrypy, dispatch, elementtree, formencode, kid, paste,
protocols, py2exe, setuptools, simplejson, turbogears,
turbojson
* Copy in my eggs (in zip format downloaded 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 in the
filenames:
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:
[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 = "" 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 -~----------~----~----~----~------~----~------~--~---
|