Changeset 64aa49e in sasview
- Timestamp:
- Apr 4, 2014 4:39:53 AM (11 years ago)
- Branches:
- master, ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc, costrafo411, magnetic_scatt, release-4.1.1, release-4.1.2, release-4.2.2, release_4.0.1, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
- Children:
- 97eed48
- Parents:
- 73bc55f1
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
ez_setup.py
ra1968c4 r64aa49e 1 #! python1 #!/usr/bin/env python 2 2 """Bootstrap setuptools installation 3 3 4 If you want to use setuptools in your package's setup.py, justinclude this5 file in the same directory with it,and add this to the top of your setup.py::4 To use setuptools in your package's setup.py, include this 5 file in the same directory and add this to the top of your setup.py:: 6 6 7 7 from ez_setup import use_setuptools 8 8 use_setuptools() 9 9 10 If you want to require a specific version of setuptools, set a download11 mirror, or use an alternate download directory, you can do so by supplying10 To require a specific version of setuptools, set a download 11 mirror, or use an alternate download directory, simply supply 12 12 the appropriate options to ``use_setuptools()``. 13 13 14 14 This file can also be run as a script to install or upgrade setuptools. 15 15 """ 16 import os 17 import shutil 16 18 import sys 17 DEFAULT_VERSION = "0.6c11" 18 DEFAULT_URL = "http://pypi.python.org/packages/%s/s/setuptools/" % sys.version[:3] 19 20 md5_data = { 21 'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca', 22 'setuptools-0.6b1-py2.4.egg': 'b79a8a403e4502fbb85ee3f1941735cb', 23 'setuptools-0.6b2-py2.3.egg': '5657759d8a6d8fc44070a9d07272d99b', 24 'setuptools-0.6b2-py2.4.egg': '4996a8d169d2be661fa32a6e52e4f82a', 25 'setuptools-0.6b3-py2.3.egg': 'bb31c0fc7399a63579975cad9f5a0618', 26 'setuptools-0.6b3-py2.4.egg': '38a8c6b3d6ecd22247f179f7da669fac', 27 'setuptools-0.6b4-py2.3.egg': '62045a24ed4e1ebc77fe039aa4e6f7e5', 28 'setuptools-0.6b4-py2.4.egg': '4cb2a185d228dacffb2d17f103b3b1c4', 29 'setuptools-0.6c1-py2.3.egg': 'b3f2b5539d65cb7f74ad79127f1a908c', 30 'setuptools-0.6c1-py2.4.egg': 'b45adeda0667d2d2ffe14009364f2a4b', 31 'setuptools-0.6c10-py2.3.egg': 'ce1e2ab5d3a0256456d9fc13800a7090', 32 'setuptools-0.6c10-py2.4.egg': '57d6d9d6e9b80772c59a53a8433a5dd4', 33 'setuptools-0.6c10-py2.5.egg': 'de46ac8b1c97c895572e5e8596aeb8c7', 34 'setuptools-0.6c10-py2.6.egg': '58ea40aef06da02ce641495523a0b7f5', 35 'setuptools-0.6c11-py2.3.egg': '2baeac6e13d414a9d28e7ba5b5a596de', 36 'setuptools-0.6c11-py2.4.egg': 'bd639f9b0eac4c42497034dec2ec0c2b', 37 'setuptools-0.6c11-py2.5.egg': '64c94f3bf7a72a13ec83e0b24f2749b2', 38 'setuptools-0.6c11-py2.6.egg': 'bfa92100bd772d5a213eedd356d64086', 39 'setuptools-0.6c2-py2.3.egg': 'f0064bf6aa2b7d0f3ba0b43f20817c27', 40 'setuptools-0.6c2-py2.4.egg': '616192eec35f47e8ea16cd6a122b7277', 41 'setuptools-0.6c3-py2.3.egg': 'f181fa125dfe85a259c9cd6f1d7b78fa', 42 'setuptools-0.6c3-py2.4.egg': 'e0ed74682c998bfb73bf803a50e7b71e', 43 'setuptools-0.6c3-py2.5.egg': 'abef16fdd61955514841c7c6bd98965e', 44 'setuptools-0.6c4-py2.3.egg': 'b0b9131acab32022bfac7f44c5d7971f', 45 'setuptools-0.6c4-py2.4.egg': '2a1f9656d4fbf3c97bf946c0a124e6e2', 46 'setuptools-0.6c4-py2.5.egg': '8f5a052e32cdb9c72bcf4b5526f28afc', 47 'setuptools-0.6c5-py2.3.egg': 'ee9fd80965da04f2f3e6b3576e9d8167', 48 'setuptools-0.6c5-py2.4.egg': 'afe2adf1c01701ee841761f5bcd8aa64', 49 'setuptools-0.6c5-py2.5.egg': 'a8d3f61494ccaa8714dfed37bccd3d5d', 50 'setuptools-0.6c6-py2.3.egg': '35686b78116a668847237b69d549ec20', 51 'setuptools-0.6c6-py2.4.egg': '3c56af57be3225019260a644430065ab', 52 'setuptools-0.6c6-py2.5.egg': 'b2f8a7520709a5b34f80946de5f02f53', 53 'setuptools-0.6c7-py2.3.egg': '209fdf9adc3a615e5115b725658e13e2', 54 'setuptools-0.6c7-py2.4.egg': '5a8f954807d46a0fb67cf1f26c55a82e', 55 'setuptools-0.6c7-py2.5.egg': '45d2ad28f9750e7434111fde831e8372', 56 'setuptools-0.6c8-py2.3.egg': '50759d29b349db8cfd807ba8303f1902', 57 'setuptools-0.6c8-py2.4.egg': 'cba38d74f7d483c06e9daa6070cce6de', 58 'setuptools-0.6c8-py2.5.egg': '1721747ee329dc150590a58b3e1ac95b', 59 'setuptools-0.6c9-py2.3.egg': 'a83c4020414807b496e4cfbe08507c03', 60 'setuptools-0.6c9-py2.4.egg': '260a2be2e5388d66bdaee06abec6342a', 61 'setuptools-0.6c9-py2.5.egg': 'fe67c3e5a17b12c0e7c541b7ea43a8e6', 62 'setuptools-0.6c9-py2.6.egg': 'ca37b1ff16fa2ede6e19383e7b59245a', 63 } 64 65 import sys, os 66 try: from hashlib import md5 67 except ImportError: from md5 import md5 68 69 def _validate_md5(egg_name, data): 70 if egg_name in md5_data: 71 digest = md5(data).hexdigest() 72 if digest != md5_data[egg_name]: 73 print >>sys.stderr, ( 74 "md5 validation of %s failed! (Possible download problem?)" 75 % egg_name 76 ) 77 sys.exit(2) 78 return data 79 80 def use_setuptools( 81 version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir, 82 download_delay=15 83 ): 84 """Automatically find/download setuptools and make it available on sys.path 85 86 `version` should be a valid setuptools version number that is available 87 as an egg for download under the `download_base` URL (which should end with 88 a '/'). `to_dir` is the directory where setuptools will be downloaded, if 89 it is not already available. If `download_delay` is specified, it should 90 be the number of seconds that will be paused before initiating a download, 91 should one be required. If an older version of setuptools is installed, 92 this routine will print a message to ``sys.stderr`` and raise SystemExit in 93 an attempt to abort the calling script. 94 """ 95 was_imported = 'pkg_resources' in sys.modules or 'setuptools' in sys.modules 96 def do_download(): 97 egg = download_setuptools(version, download_base, to_dir, download_delay) 98 sys.path.insert(0, egg) 99 import setuptools; setuptools.bootstrap_install_from = egg 19 import tempfile 20 import zipfile 21 import optparse 22 import subprocess 23 import platform 24 import textwrap 25 import contextlib 26 27 from distutils import log 28 29 try: 30 from site import USER_SITE 31 except ImportError: 32 USER_SITE = None 33 34 DEFAULT_VERSION = "3.4.1" 35 DEFAULT_URL = "https://pypi.python.org/packages/source/s/setuptools/" 36 37 def _python_cmd(*args): 38 """ 39 Return True if the command succeeded. 40 """ 41 args = (sys.executable,) + args 42 return subprocess.call(args) == 0 43 44 45 def _install(archive_filename, install_args=()): 46 with archive_context(archive_filename): 47 # installing 48 log.warn('Installing Setuptools') 49 if not _python_cmd('setup.py', 'install', *install_args): 50 log.warn('Something went wrong during the installation.') 51 log.warn('See the error message above.') 52 # exitcode will be 2 53 return 2 54 55 56 def _build_egg(egg, archive_filename, to_dir): 57 with archive_context(archive_filename): 58 # building an egg 59 log.warn('Building a Setuptools egg in %s', to_dir) 60 _python_cmd('setup.py', '-q', 'bdist_egg', '--dist-dir', to_dir) 61 # returning the result 62 log.warn(egg) 63 if not os.path.exists(egg): 64 raise IOError('Could not build the egg.') 65 66 67 def get_zip_class(): 68 """ 69 Supplement ZipFile class to support context manager for Python 2.6 70 """ 71 class ContextualZipFile(zipfile.ZipFile): 72 def __enter__(self): 73 return self 74 def __exit__(self, type, value, traceback): 75 self.close 76 return zipfile.ZipFile if hasattr(zipfile.ZipFile, '__exit__') else \ 77 ContextualZipFile 78 79 80 @contextlib.contextmanager 81 def archive_context(filename): 82 # extracting the archive 83 tmpdir = tempfile.mkdtemp() 84 log.warn('Extracting in %s', tmpdir) 85 old_wd = os.getcwd() 86 try: 87 os.chdir(tmpdir) 88 with get_zip_class()(filename) as archive: 89 archive.extractall() 90 91 # going in the directory 92 subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0]) 93 os.chdir(subdir) 94 log.warn('Now working in %s', subdir) 95 yield 96 97 finally: 98 os.chdir(old_wd) 99 shutil.rmtree(tmpdir) 100 101 102 def _do_download(version, download_base, to_dir, download_delay): 103 egg = os.path.join(to_dir, 'setuptools-%s-py%d.%d.egg' 104 % (version, sys.version_info[0], sys.version_info[1])) 105 if not os.path.exists(egg): 106 archive = download_setuptools(version, download_base, 107 to_dir, download_delay) 108 _build_egg(egg, archive, to_dir) 109 sys.path.insert(0, egg) 110 111 # Remove previously-imported pkg_resources if present (see 112 # https://bitbucket.org/pypa/setuptools/pull-request/7/ for details). 113 if 'pkg_resources' in sys.modules: 114 del sys.modules['pkg_resources'] 115 116 import setuptools 117 setuptools.bootstrap_install_from = egg 118 119 120 def use_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL, 121 to_dir=os.curdir, download_delay=15): 122 to_dir = os.path.abspath(to_dir) 123 rep_modules = 'pkg_resources', 'setuptools' 124 imported = set(sys.modules).intersection(rep_modules) 100 125 try: 101 126 import pkg_resources 102 127 except ImportError: 103 return do_download() 104 try: 105 pkg_resources.require("setuptools>="+version); return 106 except pkg_resources.VersionConflict, e: 107 if was_imported: 108 print >>sys.stderr, ( 109 "The required version of setuptools (>=%s) is not available, and\n" 110 "can't be installed while this script is running. Please install\n" 111 " a more recent version first, using 'easy_install -U setuptools'." 112 "\n\n(Currently using %r)" 113 ) % (version, e.args[0]) 128 return _do_download(version, download_base, to_dir, download_delay) 129 try: 130 pkg_resources.require("setuptools>=" + version) 131 return 132 except pkg_resources.DistributionNotFound: 133 return _do_download(version, download_base, to_dir, download_delay) 134 except pkg_resources.VersionConflict as VC_err: 135 if imported: 136 msg = textwrap.dedent(""" 137 The required version of setuptools (>={version}) is not available, 138 and can't be installed while this script is running. Please 139 install a more recent version first, using 140 'easy_install -U setuptools'. 141 142 (Currently using {VC_err.args[0]!r}) 143 """).format(VC_err=VC_err, version=version) 144 sys.stderr.write(msg) 114 145 sys.exit(2) 115 except pkg_resources.DistributionNotFound: 116 pass 117 118 del pkg_resources, sys.modules['pkg_resources'] # reload ok 119 return do_download() 120 121 def download_setuptools( 122 version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir, 123 delay = 15 124 ): 125 """Download setuptools from a specified location and return its filename 146 147 # otherwise, reload ok 148 del pkg_resources, sys.modules['pkg_resources'] 149 return _do_download(version, download_base, to_dir, download_delay) 150 151 def _clean_check(cmd, target): 152 """ 153 Run the command to download target. If the command fails, clean up before 154 re-raising the error. 155 """ 156 try: 157 subprocess.check_call(cmd) 158 except subprocess.CalledProcessError: 159 if os.access(target, os.F_OK): 160 os.unlink(target) 161 raise 162 163 def download_file_powershell(url, target): 164 """ 165 Download the file at url to target using Powershell (which will validate 166 trust). Raise an exception if the command cannot complete. 167 """ 168 target = os.path.abspath(target) 169 cmd = [ 170 'powershell', 171 '-Command', 172 "(new-object System.Net.WebClient).DownloadFile(%(url)r, %(target)r)" % vars(), 173 ] 174 _clean_check(cmd, target) 175 176 def has_powershell(): 177 if platform.system() != 'Windows': 178 return False 179 cmd = ['powershell', '-Command', 'echo test'] 180 devnull = open(os.path.devnull, 'wb') 181 try: 182 try: 183 subprocess.check_call(cmd, stdout=devnull, stderr=devnull) 184 except Exception: 185 return False 186 finally: 187 devnull.close() 188 return True 189 190 download_file_powershell.viable = has_powershell 191 192 def download_file_curl(url, target): 193 cmd = ['curl', url, '--silent', '--output', target] 194 _clean_check(cmd, target) 195 196 def has_curl(): 197 cmd = ['curl', '--version'] 198 devnull = open(os.path.devnull, 'wb') 199 try: 200 try: 201 subprocess.check_call(cmd, stdout=devnull, stderr=devnull) 202 except Exception: 203 return False 204 finally: 205 devnull.close() 206 return True 207 208 download_file_curl.viable = has_curl 209 210 def download_file_wget(url, target): 211 cmd = ['wget', url, '--quiet', '--output-document', target] 212 _clean_check(cmd, target) 213 214 def has_wget(): 215 cmd = ['wget', '--version'] 216 devnull = open(os.path.devnull, 'wb') 217 try: 218 try: 219 subprocess.check_call(cmd, stdout=devnull, stderr=devnull) 220 except Exception: 221 return False 222 finally: 223 devnull.close() 224 return True 225 226 download_file_wget.viable = has_wget 227 228 def download_file_insecure(url, target): 229 """ 230 Use Python to download the file, even though it cannot authenticate the 231 connection. 232 """ 233 try: 234 from urllib.request import urlopen 235 except ImportError: 236 from urllib2 import urlopen 237 src = dst = None 238 try: 239 src = urlopen(url) 240 # Read/write all in one block, so we don't create a corrupt file 241 # if the download is interrupted. 242 data = src.read() 243 dst = open(target, "wb") 244 dst.write(data) 245 finally: 246 if src: 247 src.close() 248 if dst: 249 dst.close() 250 251 download_file_insecure.viable = lambda: True 252 253 def get_best_downloader(): 254 downloaders = [ 255 download_file_powershell, 256 download_file_curl, 257 download_file_wget, 258 download_file_insecure, 259 ] 260 261 for dl in downloaders: 262 if dl.viable(): 263 return dl 264 265 def download_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL, 266 to_dir=os.curdir, delay=15, downloader_factory=get_best_downloader): 267 """ 268 Download setuptools from a specified location and return its filename 126 269 127 270 `version` should be a valid setuptools version number that is available 128 271 as an egg for download under the `download_base` URL (which should end 129 272 with a '/'). `to_dir` is the directory where the egg will be downloaded. 130 `delay` is the number of seconds to pause before an actual download attempt. 131 """ 132 import urllib2, shutil 133 egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3]) 134 url = download_base + egg_name 135 saveto = os.path.join(to_dir, egg_name) 136 src = dst = None 273 `delay` is the number of seconds to pause before an actual download 274 attempt. 275 276 ``downloader_factory`` should be a function taking no arguments and 277 returning a function for downloading a URL to a target. 278 """ 279 # making sure we use the absolute path 280 to_dir = os.path.abspath(to_dir) 281 zip_name = "setuptools-%s.zip" % version 282 url = download_base + zip_name 283 saveto = os.path.join(to_dir, zip_name) 137 284 if not os.path.exists(saveto): # Avoid repeated downloads 138 try: 139 from distutils import log 140 if delay: 141 log.warn(""" 142 --------------------------------------------------------------------------- 143 This script requires setuptools version %s to run (even to display 144 help). I will attempt to download it for you (from 145 %s), but 146 you may need to enable firewall access for this script first. 147 I will start the download in %d seconds. 148 149 (Note: if this machine does not have network access, please obtain the file 150 151 %s 152 153 and place it in this directory before rerunning this script.) 154 ---------------------------------------------------------------------------""", 155 version, download_base, delay, url 156 ); from time import sleep; sleep(delay) 157 log.warn("Downloading %s", url) 158 src = urllib2.urlopen(url) 159 # Read/write all in one block, so we don't create a corrupt file 160 # if the download is interrupted. 161 data = _validate_md5(egg_name, src.read()) 162 dst = open(saveto,"wb"); dst.write(data) 163 finally: 164 if src: src.close() 165 if dst: dst.close() 285 log.warn("Downloading %s", url) 286 downloader = downloader_factory() 287 downloader(url, saveto) 166 288 return os.path.realpath(saveto) 167 289 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 def main(argv, version=DEFAULT_VERSION): 290 def _build_install_args(options): 291 """ 292 Build the arguments to 'python setup.py install' on the setuptools package 293 """ 294 return ['--user'] if options.user_install else [] 295 296 def _parse_args(): 297 """ 298 Parse the command line for options 299 """ 300 parser = optparse.OptionParser() 301 parser.add_option( 302 '--user', dest='user_install', action='store_true', default=False, 303 help='install in user site package (requires Python 2.6 or later)') 304 parser.add_option( 305 '--download-base', dest='download_base', metavar="URL", 306 default=DEFAULT_URL, 307 help='alternative URL from where to download the setuptools package') 308 parser.add_option( 309 '--insecure', dest='downloader_factory', action='store_const', 310 const=lambda: download_file_insecure, default=get_best_downloader, 311 help='Use internal, non-validating downloader' 312 ) 313 parser.add_option( 314 '--version', help="Specify which version to download", 315 default=DEFAULT_VERSION, 316 ) 317 options, args = parser.parse_args() 318 # positional arguments are ignored 319 return options 320 321 def main(): 204 322 """Install or upgrade setuptools and EasyInstall""" 205 try: 206 import setuptools 207 except ImportError: 208 egg = None 209 try: 210 egg = download_setuptools(version, delay=0) 211 sys.path.insert(0,egg) 212 from setuptools.command.easy_install import main 213 return main(list(argv)+[egg]) # we're done here 214 finally: 215 if egg and os.path.exists(egg): 216 os.unlink(egg) 217 else: 218 if setuptools.__version__ == '0.0.1': 219 print >>sys.stderr, ( 220 "You have an obsolete version of setuptools installed. Please\n" 221 "remove it from your system entirely before rerunning this script." 222 ) 223 sys.exit(2) 224 225 req = "setuptools>="+version 226 import pkg_resources 227 try: 228 pkg_resources.require(req) 229 except pkg_resources.VersionConflict: 230 try: 231 from setuptools.command.easy_install import main 232 except ImportError: 233 from easy_install import main 234 main(list(argv)+[download_setuptools(delay=0)]) 235 sys.exit(0) # try to force an exit 236 else: 237 if argv: 238 from setuptools.command.easy_install import main 239 main(argv) 240 else: 241 print "Setuptools version",version,"or greater has been installed." 242 print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)' 243 244 def update_md5(filenames): 245 """Update our built-in md5 registry""" 246 247 import re 248 249 for name in filenames: 250 base = os.path.basename(name) 251 f = open(name,'rb') 252 md5_data[base] = md5(f.read()).hexdigest() 253 f.close() 254 255 data = [" %r: %r,\n" % it for it in md5_data.items()] 256 data.sort() 257 repl = "".join(data) 258 259 import inspect 260 srcfile = inspect.getsourcefile(sys.modules[__name__]) 261 f = open(srcfile, 'rb'); src = f.read(); f.close() 262 263 match = re.search("\nmd5_data = {\n([^}]+)}", src) 264 if not match: 265 print >>sys.stderr, "Internal error!" 266 sys.exit(2) 267 268 src = src[:match.start(1)] + repl + src[match.end(1):] 269 f = open(srcfile,'w') 270 f.write(src) 271 f.close() 272 273 274 if __name__=='__main__': 275 if len(sys.argv)>2 and sys.argv[1]=='--md5update': 276 update_md5(sys.argv[2:]) 277 else: 278 main(sys.argv[1:]) 279 280 281 282 283 284 323 options = _parse_args() 324 archive = download_setuptools( 325 version=options.version, 326 download_base=options.download_base, 327 downloader_factory=options.downloader_factory, 328 ) 329 return _install(archive, _build_install_args(options)) 330 331 if __name__ == '__main__': 332 sys.exit(main())
Note: See TracChangeset
for help on using the changeset viewer.