While installing Tahoe http://allmydata.org/trac/tahoe I ran into problems after I did a 'sudo python setup.py install'. It compiled and installed fine, and it ran fine from within the source tree (./bin/tahoe), but when I attempted to use the system-wide tahoe executable, it failed on importing two libraries tahoe installed (allmydata and pyutils). Eventually I discovered it was because the libraries were indeed in site-packages/, but they didn't have permissions allowing a mere user to read or use them. Which is a bad thing. I am using Gentoo: gwern@localhost:1001~>uname -a [10:26PM] Linux localhost 2.6.24-gentoo-r3 #8 SMP PREEMPT Mon Mar 17 23:08:31 EDT 2008 x86_64 Intel(R) Core(TM)2 Quad CPU @ 2.40GHz GenuineIntel GNU/Linux I have installed: * dev-python/setuptools Latest version available: 0.6_rc8 Latest version installed: 0.6_rc8 Size of files: 244 kB Homepage: http://peak.telecommunity.com/DevCenter/setuptools Description: A collection of enhancements to the Python distutils including easy install License: PSF-2.2 --- The Tahoe devs on #tahoe disclaim any responsibilty for this problem (I eventually fixed it with a recursive chmod), but I'm inlining their setup.py anyway: -- #! /usr/bin/env python # Allmydata Tahoe -- secure, distributed storage grid # # Copyright (C) 2008 Allmydata, Inc. # # This file is part of tahoe. # # See the docs/about.html file for licensing information. import os, re, sys try: from ez_setup import use_setuptools except ImportError: pass else: # This invokes our own customized version of ez_setup.py to make sure that # setuptools >= v0.6c8 (a.k.a. v0.6-final) is installed. # setuptools < v0.6c8 doesn't handle eggs which get installed into the CWD # as a result of being transitively depended on in a setup_requires, but # then are needed for the installed code to run, i.e. in an # install_requires. use_setuptools(download_delay=0, min_version="0.6c8") from setuptools import Extension, find_packages, setup # Make the dependency-version-requirement, which is used by the Makefile at # build-time, also available to the app at runtime: import shutil try: shutil.copyfile("_auto_deps.py", os.path.join("src", "allmydata", "_auto_deps.py")) except EnvironmentError: # Nevermind then -- perhaps it is already in place and in any case we can do # without it. pass trove_classifiers=[ "Development Status :: 4 - Beta", "Environment :: Console", "Environment :: Web Environment", "License :: OSI Approved :: GNU General Public License (GPL)", "License :: DFSG approved", "License :: Other/Proprietary License", "Intended Audience :: Developers", "Intended Audience :: End Users/Desktop", "Intended Audience :: System Administrators", "Operating System :: Microsoft", "Operating System :: Microsoft :: Windows", "Operating System :: Unix", "Operating System :: POSIX :: Linux", "Operating System :: POSIX", "Operating System :: MacOS :: MacOS X", "Operating System :: Microsoft :: Windows :: Windows NT/2000", "Operating System :: OS Independent", "Natural Language :: English", "Programming Language :: C", "Programming Language :: Python", "Topic :: Utilities", "Topic :: System :: Systems Administration", "Topic :: System :: Filesystems", "Topic :: System :: Distributed Computing", "Topic :: Software Development :: Libraries", "Topic :: Communications :: Usenet News", "Topic :: System :: Archiving :: Backup", "Topic :: System :: Archiving :: Mirroring", "Topic :: System :: Archiving", ] VERSIONFILE = "src/allmydata/_version.py" verstr = "unknown" try: verstrline = open(VERSIONFILE, "rt").read() except EnvironmentError: pass # Okay, there is no version file. else: VSRE = r"^verstr = ['\"]([^'\"]*)['\"]" mo = re.search(VSRE, verstrline, re.M) if mo: verstr = mo.group(1) else: print "unable to find version in %s" % (VERSIONFILE,) raise RuntimeError("if %s.py exists, it is required to be well-formed" % (VERSIONFILE,)) LONG_DESCRIPTION=\ """Welcome to the Tahoe project, a secure, decentralized, fault-tolerant filesystem. All of the source code is available under a Free Software, Open Source licence. This filesystem is encrypted and spread over multiple peers in such a way that it remains available even when some of the peers are unavailable, malfunctioning, or malicious.""" miscdeps=os.path.join(os.getcwd(), 'misc', 'dependencies') dependency_links=[os.path.join(miscdeps, t) for t in os.listdir(miscdeps) if t.endswith(".tar")] # By adding a web page to the dependency_links we are able to put new packages # up there and have them be automatically discovered by existing copies of the # tahoe source when that source was built. dependency_links.append("http://allmydata.org/trac/tahoe/wiki/Dependencies") setup_requires = ['pyutil >= 1.3.16'] # used by the Windows installer builder, see misc/sub-ver.py # darcsver is needed only if you want "./setup.py darcsver" to write a new # version stamp in src/allmydata/_version.py, with a version number derived from # darcs history. # http://pypi.python.org/pypi/darcsver setup_requires.append('darcsver >= 1.1.2') # setuptools_darcs is required to produce complete distributions (such as with # "sdist" or "bdist_egg"), unless there is a PKG-INFO file present which shows # that this is itself a source distribution. # http://pypi.python.org/pypi/setuptools_darcs if not os.path.exists('PKG-INFO'): setup_requires.append('setuptools_darcs >= 1.1.0') import _auto_deps setup(name='allmydata-tahoe', version=verstr, description='secure, decentralized, fault-tolerant filesystem', long_description=LONG_DESCRIPTION, author='Allmydata, Inc.', author_email='tahoe-dev@allmydata.org', url='http://allmydata.org/', license='GNU GPL', package_dir = {'':'src'}, packages=find_packages("src"), classifiers=trove_classifiers, test_suite="allmydata.test", install_requires=_auto_deps.install_requires, include_package_data=True, setup_requires=setup_requires, dependency_links=dependency_links, entry_points = { 'console_scripts': [ 'tahoe = allmydata.scripts.runner:run' ] }, zip_safe=False, # We prefer unzipped for easier access. ) Reproducible: Always Steps to Reproduce: 1. 'cd ~/trunk; sudo python setup.py install' 2. 'cd; tahoe start' 3. Witness an error like: Traceback (most recent call last): File "/usr/bin/tahoe", line 8, in <module> load_entry_point('allmydata-tahoe==1.0.0-r2373', 'console_scripts', 'tahoe')() File "/usr/lib64/python2.5/site-packages/setuptools-0.6c8.egg/pkg_resources.py", line 277, in load_entry_point return get_distribution(dist).load_entry_point(group, name) File "/usr/lib64/python2.5/site-packages/setuptools-0.6c8.egg/pkg_resources.py", line 2179, in load_entry_point return ep.load() File "/usr/lib64/python2.5/site-packages/setuptools-0.6c8.egg/pkg_resources.py", line 1912, in load entry = __import__(self.module_name, globals(),globals(), ['__name__']) File "/usr/lib64/python2.5/site-packages/allmydata_tahoe-1.0.0_r2373-py2.5.egg/allmydata/__init__.py", line 31, in <module> _auto_deps.require_auto_deps() File "/usr/lib64/python2.5/site-packages/allmydata_tahoe-1.0.0_r2373-py2.5.egg/allmydata/_auto_deps.py", line 38, in require_auto_deps __import__(name) File "/usr/lib64/python2.5/site-packages/zfec-1.3.4-py2.5-linux-x86_64.egg/zfec/__init__.py", line 19, in <module> import easyfec, filefec, cmdline_zfec, cmdline_zunfec File "/usr/lib64/python2.5/site-packages/zfec-1.3.4-py2.5-linux-x86_64.egg/zfec/filefec.py", line 2, in <module> from pyutil import fileutil ImportError: No module named pyutil I thought about filing this upstream, but nobody at #tahoe or #python on Freenode mentioned seeing this before with setuptools (and I couldn't manage to log into Sourceforge's mess of a site).
This is a known issue upstream, we'll wait for them to work it out. http://bugs.python.org/setuptools/issue6 Note: This bug doesn't affect ebuilds that use setuptools.