This file can also be run as a script to install or upgrade setuptools.
"""
-import sys
-
+import subprocess, sys
DEFAULT_VERSION = "0.6c7"
DEFAULT_URL = "http://pypi.python.org/packages/%s/s/setuptools/" % sys.version[:3]
sys.exit(2)
return data
+def setuptools_is_loaded():
+ return 'pkg_resources' in sys.modules or 'setuptools' in sys.modules
+
+def get_setuptools_version():
+ sub = subprocess.Popen([sys.executable, "-c", "import setuptools;print setuptools.__version__"], stdout=subprocess.PIPE)
+ return sub.stdout.read().strip()
+
+def setuptools_is_new_enough(required_version):
+ """Return True if setuptools is already installed and has a version
+ number >= required_version."""
+ verstr = get_setuptools_version()
+ import pkg_resources
+ try:
+ ver = pkg_resources.parse_version(verstr)
+ newenough = ver and ver >= pkg_resources.parse_version(required_version)
+ finally:
+ del sys.modules['pkg_resources']
+ return newenough
def use_setuptools(
- version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir, min_version=None
+ version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
+ min_version=None, download_delay=15
):
"""Automatically find/download setuptools and make it available on sys.path
`version` should be a valid setuptools version number that is available
as an egg for download under the `download_base` URL (which should end with
a '/'). `to_dir` is the directory where setuptools will be downloaded, if
- it is not already available. If an older version of setuptools is installed,
+ it is not already available. If `download_delay` is specified, it should
+ be the number of seconds that will be paused before initiating a download,
+ should one be required. If an older version of setuptools is installed,
this routine will print a message to ``sys.stderr`` and raise SystemExit in
an attempt to abort the calling script.
"""
- try:
- import setuptools
- if setuptools.__version__ == '0.0.1':
+ if min_version is None:
+ min_version = version
+ if setuptools_is_loaded():
+ # setuptools is installed, but can't be upgraded, so just version
+ # check (using pkg_resources) and exit if it's not a good enough
+ # version.
+ if not setuptools_is_new_enough(min_version):
print >>sys.stderr, (
- "You have an obsolete version of setuptools installed. Please\n"
- "remove it from your system entirely before rerunning this script."
- )
- sys.exit(2)
- except ImportError:
- egg = download_setuptools(version, download_base, to_dir)
- sys.path.insert(0, egg)
- import setuptools; setuptools.bootstrap_install_from = egg
-
- import pkg_resources
- try:
- if not min_version:
- min_version = version
- pkg_resources.require("setuptools>="+min_version)
-
- except pkg_resources.VersionConflict, e:
- # XXX could we install in a subprocess here?
- print >>sys.stderr, (
- "The required version of setuptools (>=%s) is not available, and\n"
+ "The required version of setuptools (>=%s) is not installed, and\n"
"can't be installed while this script is running. Please install\n"
- " a more recent version first.\n\n(Currently using %r)"
- ) % (min_version, e.args[0])
- sys.exit(2)
+ "a more recent version first.\n\n(Currently using %r)"
+ ) % (min_version, get_setuptools_version())
+ sys.exit(2)
+ else:
+ if not setuptools_is_new_enough(min_version):
+ egg = download_setuptools(version, download_base, to_dir, download_delay)
+ sys.path.insert(0, egg)
+ import setuptools; setuptools.bootstrap_install_from = egg
def download_setuptools(
- version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir
+ version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
+ delay = 15
):
"""Download setuptools from a specified location and return its filename
`version` should be a valid setuptools version number that is available
as an egg for download under the `download_base` URL (which should end
with a '/'). `to_dir` is the directory where the egg will be downloaded.
+ `delay` is the number of seconds to pause before an actual download attempt.
"""
import urllib2, shutil
egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3])
if not os.path.exists(saveto): # Avoid repeated downloads
try:
from distutils import log
- if download_base.startswith("file:"):
- log.warn("Unpacking %s", url)
- else:
+ if delay:
log.warn("""
---------------------------------------------------------------------------
This script requires setuptools version %s to run (even to display
help). I will attempt to download it for you (from
%s), but
you may need to enable firewall access for this script first.
+I will start the download in %d seconds.
(Note: if this machine does not have network access, please obtain the file
and place it in this directory before rerunning this script.)
---------------------------------------------------------------------------""",
- version, download_base, url
- );
- log.warn("Downloading %s", url)
+ version, download_base, delay, url
+ ); from time import sleep; sleep(delay)
+ log.warn("Downloading %s", url)
src = urllib2.urlopen(url)
# Read/write all in one block, so we don't create a corrupt file
# if the download is interrupted.
def main(argv, version=DEFAULT_VERSION):
"""Install or upgrade setuptools and EasyInstall"""
- try:
- import setuptools
- except ImportError:
- egg = None
- try:
- egg = download_setuptools(version)
- sys.path.insert(0,egg)
- from setuptools.command.easy_install import main
- return main(list(argv)+[egg]) # we're done here
- finally:
- if egg and os.path.exists(egg):
- os.unlink(egg)
- else:
- if setuptools.__version__ == '0.0.1':
- # tell the user to uninstall obsolete version
- use_setuptools(version)
-
- req = "setuptools>="+version
- import pkg_resources
- try:
- pkg_resources.require(req)
- except pkg_resources.VersionConflict:
- try:
- from setuptools.command.easy_install import main
- except ImportError:
- from easy_install import main
- main(list(argv)+[download_setuptools()])
- sys.exit(0) # try to force an exit
+ if setuptools_is_loaded():
+ # setuptools is installed, but can't be upgraded, so just version
+ # check (using pkg_resources) and exit if it's not a good enough
+ # version.
+ if not setuptools_is_new_enough(version):
+ print >>sys.stderr, (
+ "The required version of setuptools (>=%s) is not installed, and\n"
+ "can't be installed while this script is running. Please install\n"
+ "a more recent version first.\n\n(Currently using %r)"
+ ) % (version, get_setuptools_version())
+ sys.exit(2)
else:
- if argv:
- from setuptools.command.easy_install import main
- main(argv)
+ if setuptools_is_new_enough(version):
+ if argv:
+ from setuptools.command.easy_install import main
+ main(argv)
+ else:
+ print "Setuptools version",version,"or greater has been installed."
+ print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)'
else:
- print "Setuptools version",version,"or greater has been installed."
- print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)'
-
-
+ egg = None
+ try:
+ egg = download_setuptools(version, delay=0)
+ sys.path.insert(0,egg)
+ from setuptools.command.easy_install import main
+ return main(list(argv)+[egg]) # we're done here
+ finally:
+ if egg and os.path.exists(egg):
+ os.unlink(egg)
def update_md5(filenames):
"""Update our built-in md5 registry"""
if __name__=='__main__':
- if len(sys.argv)>2 and sys.argv[1]=='--md5update':
- update_md5(sys.argv[2:])
+ if '--md5update' in sys.argv[1]:
+ sys.argv.remove('--md5update')
+ update_md5(sys.argv[1:])
else:
main(sys.argv[1:])
-
-
-
-
-