|
1 #!/usr/bin/env python2.6 |
|
2 ## WARNING: This file is generated |
|
3 #!/usr/bin/env python |
|
4 """Create a "virtual" Python installation |
|
5 """ |
|
6 |
|
7 # If you change the version here, change it in setup.py |
|
8 # and docs/conf.py as well. |
|
9 virtualenv_version = "1.6.4" |
|
10 |
|
11 import base64 |
|
12 import sys |
|
13 import os |
|
14 import optparse |
|
15 import re |
|
16 import shutil |
|
17 import logging |
|
18 import tempfile |
|
19 import zlib |
|
20 import errno |
|
21 import distutils.sysconfig |
|
22 try: |
|
23 import subprocess |
|
24 except ImportError: |
|
25 if sys.version_info <= (2, 3): |
|
26 print('ERROR: %s' % sys.exc_info()[1]) |
|
27 print('ERROR: this script requires Python 2.4 or greater; or at least the subprocess module.') |
|
28 print('If you copy subprocess.py from a newer version of Python this script will probably work') |
|
29 sys.exit(101) |
|
30 else: |
|
31 raise |
|
32 try: |
|
33 set |
|
34 except NameError: |
|
35 from sets import Set as set |
|
36 try: |
|
37 basestring |
|
38 except NameError: |
|
39 basestring = str |
|
40 |
|
41 join = os.path.join |
|
42 py_version = 'python%s.%s' % (sys.version_info[0], sys.version_info[1]) |
|
43 |
|
44 is_jython = sys.platform.startswith('java') |
|
45 is_pypy = hasattr(sys, 'pypy_version_info') |
|
46 is_win = (sys.platform == 'win32') |
|
47 abiflags = getattr(sys, 'abiflags', '') |
|
48 |
|
49 if is_pypy: |
|
50 expected_exe = 'pypy' |
|
51 elif is_jython: |
|
52 expected_exe = 'jython' |
|
53 else: |
|
54 expected_exe = 'python' |
|
55 |
|
56 |
|
57 REQUIRED_MODULES = ['os', 'posix', 'posixpath', 'nt', 'ntpath', 'genericpath', |
|
58 'fnmatch', 'locale', 'encodings', 'codecs', |
|
59 'stat', 'UserDict', 'readline', 'copy_reg', 'types', |
|
60 're', 'sre', 'sre_parse', 'sre_constants', 'sre_compile', |
|
61 'zlib'] |
|
62 |
|
63 REQUIRED_FILES = ['lib-dynload', 'config'] |
|
64 |
|
65 majver, minver = sys.version_info[:2] |
|
66 if majver == 2: |
|
67 if minver >= 6: |
|
68 REQUIRED_MODULES.extend(['warnings', 'linecache', '_abcoll', 'abc']) |
|
69 if minver >= 7: |
|
70 REQUIRED_MODULES.extend(['_weakrefset']) |
|
71 if minver <= 3: |
|
72 REQUIRED_MODULES.extend(['sets', '__future__']) |
|
73 elif majver == 3: |
|
74 # Some extra modules are needed for Python 3, but different ones |
|
75 # for different versions. |
|
76 REQUIRED_MODULES.extend(['_abcoll', 'warnings', 'linecache', 'abc', 'io', |
|
77 '_weakrefset', 'copyreg', 'tempfile', 'random', |
|
78 '__future__', 'collections', 'keyword', 'tarfile', |
|
79 'shutil', 'struct', 'copy']) |
|
80 if minver >= 2: |
|
81 REQUIRED_FILES[-1] = 'config-%s' % majver |
|
82 if minver == 3: |
|
83 # The whole list of 3.3 modules is reproduced below - the current |
|
84 # uncommented ones are required for 3.3 as of now, but more may be |
|
85 # added as 3.3 development continues. |
|
86 REQUIRED_MODULES.extend([ |
|
87 #"aifc", |
|
88 #"antigravity", |
|
89 #"argparse", |
|
90 #"ast", |
|
91 #"asynchat", |
|
92 #"asyncore", |
|
93 "base64", |
|
94 #"bdb", |
|
95 #"binhex", |
|
96 "bisect", |
|
97 #"calendar", |
|
98 #"cgi", |
|
99 #"cgitb", |
|
100 #"chunk", |
|
101 #"cmd", |
|
102 #"codeop", |
|
103 #"code", |
|
104 #"colorsys", |
|
105 #"_compat_pickle", |
|
106 #"compileall", |
|
107 #"concurrent", |
|
108 #"configparser", |
|
109 #"contextlib", |
|
110 #"cProfile", |
|
111 #"crypt", |
|
112 #"csv", |
|
113 #"ctypes", |
|
114 #"curses", |
|
115 #"datetime", |
|
116 #"dbm", |
|
117 #"decimal", |
|
118 #"difflib", |
|
119 #"dis", |
|
120 #"doctest", |
|
121 #"dummy_threading", |
|
122 "_dummy_thread", |
|
123 #"email", |
|
124 #"filecmp", |
|
125 #"fileinput", |
|
126 #"formatter", |
|
127 #"fractions", |
|
128 #"ftplib", |
|
129 #"functools", |
|
130 #"getopt", |
|
131 #"getpass", |
|
132 #"gettext", |
|
133 #"glob", |
|
134 #"gzip", |
|
135 "hashlib", |
|
136 "heapq", |
|
137 "hmac", |
|
138 #"html", |
|
139 #"http", |
|
140 #"idlelib", |
|
141 #"imaplib", |
|
142 #"imghdr", |
|
143 #"importlib", |
|
144 #"inspect", |
|
145 #"json", |
|
146 #"lib2to3", |
|
147 #"logging", |
|
148 #"macpath", |
|
149 #"macurl2path", |
|
150 #"mailbox", |
|
151 #"mailcap", |
|
152 #"_markupbase", |
|
153 #"mimetypes", |
|
154 #"modulefinder", |
|
155 #"multiprocessing", |
|
156 #"netrc", |
|
157 #"nntplib", |
|
158 #"nturl2path", |
|
159 #"numbers", |
|
160 #"opcode", |
|
161 #"optparse", |
|
162 #"os2emxpath", |
|
163 #"pdb", |
|
164 #"pickle", |
|
165 #"pickletools", |
|
166 #"pipes", |
|
167 #"pkgutil", |
|
168 #"platform", |
|
169 #"plat-linux2", |
|
170 #"plistlib", |
|
171 #"poplib", |
|
172 #"pprint", |
|
173 #"profile", |
|
174 #"pstats", |
|
175 #"pty", |
|
176 #"pyclbr", |
|
177 #"py_compile", |
|
178 #"pydoc_data", |
|
179 #"pydoc", |
|
180 #"_pyio", |
|
181 #"queue", |
|
182 #"quopri", |
|
183 "reprlib", |
|
184 "rlcompleter", |
|
185 #"runpy", |
|
186 #"sched", |
|
187 #"shelve", |
|
188 #"shlex", |
|
189 #"smtpd", |
|
190 #"smtplib", |
|
191 #"sndhdr", |
|
192 #"socket", |
|
193 #"socketserver", |
|
194 #"sqlite3", |
|
195 #"ssl", |
|
196 #"stringprep", |
|
197 #"string", |
|
198 #"_strptime", |
|
199 #"subprocess", |
|
200 #"sunau", |
|
201 #"symbol", |
|
202 #"symtable", |
|
203 #"sysconfig", |
|
204 #"tabnanny", |
|
205 #"telnetlib", |
|
206 #"test", |
|
207 #"textwrap", |
|
208 #"this", |
|
209 #"_threading_local", |
|
210 #"threading", |
|
211 #"timeit", |
|
212 #"tkinter", |
|
213 #"tokenize", |
|
214 #"token", |
|
215 #"traceback", |
|
216 #"trace", |
|
217 #"tty", |
|
218 #"turtledemo", |
|
219 #"turtle", |
|
220 #"unittest", |
|
221 #"urllib", |
|
222 #"uuid", |
|
223 #"uu", |
|
224 #"wave", |
|
225 "weakref", |
|
226 #"webbrowser", |
|
227 #"wsgiref", |
|
228 #"xdrlib", |
|
229 #"xml", |
|
230 #"xmlrpc", |
|
231 #"zipfile", |
|
232 ]) |
|
233 |
|
234 if is_pypy: |
|
235 # these are needed to correctly display the exceptions that may happen |
|
236 # during the bootstrap |
|
237 REQUIRED_MODULES.extend(['traceback', 'linecache']) |
|
238 |
|
239 class Logger(object): |
|
240 |
|
241 """ |
|
242 Logging object for use in command-line script. Allows ranges of |
|
243 levels, to avoid some redundancy of displayed information. |
|
244 """ |
|
245 |
|
246 DEBUG = logging.DEBUG |
|
247 INFO = logging.INFO |
|
248 NOTIFY = (logging.INFO+logging.WARN)/2 |
|
249 WARN = WARNING = logging.WARN |
|
250 ERROR = logging.ERROR |
|
251 FATAL = logging.FATAL |
|
252 |
|
253 LEVELS = [DEBUG, INFO, NOTIFY, WARN, ERROR, FATAL] |
|
254 |
|
255 def __init__(self, consumers): |
|
256 self.consumers = consumers |
|
257 self.indent = 0 |
|
258 self.in_progress = None |
|
259 self.in_progress_hanging = False |
|
260 |
|
261 def debug(self, msg, *args, **kw): |
|
262 self.log(self.DEBUG, msg, *args, **kw) |
|
263 def info(self, msg, *args, **kw): |
|
264 self.log(self.INFO, msg, *args, **kw) |
|
265 def notify(self, msg, *args, **kw): |
|
266 self.log(self.NOTIFY, msg, *args, **kw) |
|
267 def warn(self, msg, *args, **kw): |
|
268 self.log(self.WARN, msg, *args, **kw) |
|
269 def error(self, msg, *args, **kw): |
|
270 self.log(self.WARN, msg, *args, **kw) |
|
271 def fatal(self, msg, *args, **kw): |
|
272 self.log(self.FATAL, msg, *args, **kw) |
|
273 def log(self, level, msg, *args, **kw): |
|
274 if args: |
|
275 if kw: |
|
276 raise TypeError( |
|
277 "You may give positional or keyword arguments, not both") |
|
278 args = args or kw |
|
279 rendered = None |
|
280 for consumer_level, consumer in self.consumers: |
|
281 if self.level_matches(level, consumer_level): |
|
282 if (self.in_progress_hanging |
|
283 and consumer in (sys.stdout, sys.stderr)): |
|
284 self.in_progress_hanging = False |
|
285 sys.stdout.write('\n') |
|
286 sys.stdout.flush() |
|
287 if rendered is None: |
|
288 if args: |
|
289 rendered = msg % args |
|
290 else: |
|
291 rendered = msg |
|
292 rendered = ' '*self.indent + rendered |
|
293 if hasattr(consumer, 'write'): |
|
294 consumer.write(rendered+'\n') |
|
295 else: |
|
296 consumer(rendered) |
|
297 |
|
298 def start_progress(self, msg): |
|
299 assert not self.in_progress, ( |
|
300 "Tried to start_progress(%r) while in_progress %r" |
|
301 % (msg, self.in_progress)) |
|
302 if self.level_matches(self.NOTIFY, self._stdout_level()): |
|
303 sys.stdout.write(msg) |
|
304 sys.stdout.flush() |
|
305 self.in_progress_hanging = True |
|
306 else: |
|
307 self.in_progress_hanging = False |
|
308 self.in_progress = msg |
|
309 |
|
310 def end_progress(self, msg='done.'): |
|
311 assert self.in_progress, ( |
|
312 "Tried to end_progress without start_progress") |
|
313 if self.stdout_level_matches(self.NOTIFY): |
|
314 if not self.in_progress_hanging: |
|
315 # Some message has been printed out since start_progress |
|
316 sys.stdout.write('...' + self.in_progress + msg + '\n') |
|
317 sys.stdout.flush() |
|
318 else: |
|
319 sys.stdout.write(msg + '\n') |
|
320 sys.stdout.flush() |
|
321 self.in_progress = None |
|
322 self.in_progress_hanging = False |
|
323 |
|
324 def show_progress(self): |
|
325 """If we are in a progress scope, and no log messages have been |
|
326 shown, write out another '.'""" |
|
327 if self.in_progress_hanging: |
|
328 sys.stdout.write('.') |
|
329 sys.stdout.flush() |
|
330 |
|
331 def stdout_level_matches(self, level): |
|
332 """Returns true if a message at this level will go to stdout""" |
|
333 return self.level_matches(level, self._stdout_level()) |
|
334 |
|
335 def _stdout_level(self): |
|
336 """Returns the level that stdout runs at""" |
|
337 for level, consumer in self.consumers: |
|
338 if consumer is sys.stdout: |
|
339 return level |
|
340 return self.FATAL |
|
341 |
|
342 def level_matches(self, level, consumer_level): |
|
343 """ |
|
344 >>> l = Logger([]) |
|
345 >>> l.level_matches(3, 4) |
|
346 False |
|
347 >>> l.level_matches(3, 2) |
|
348 True |
|
349 >>> l.level_matches(slice(None, 3), 3) |
|
350 False |
|
351 >>> l.level_matches(slice(None, 3), 2) |
|
352 True |
|
353 >>> l.level_matches(slice(1, 3), 1) |
|
354 True |
|
355 >>> l.level_matches(slice(2, 3), 1) |
|
356 False |
|
357 """ |
|
358 if isinstance(level, slice): |
|
359 start, stop = level.start, level.stop |
|
360 if start is not None and start > consumer_level: |
|
361 return False |
|
362 if stop is not None and stop <= consumer_level: |
|
363 return False |
|
364 return True |
|
365 else: |
|
366 return level >= consumer_level |
|
367 |
|
368 #@classmethod |
|
369 def level_for_integer(cls, level): |
|
370 levels = cls.LEVELS |
|
371 if level < 0: |
|
372 return levels[0] |
|
373 if level >= len(levels): |
|
374 return levels[-1] |
|
375 return levels[level] |
|
376 |
|
377 level_for_integer = classmethod(level_for_integer) |
|
378 |
|
379 # create a silent logger just to prevent this from being undefined |
|
380 # will be overridden with requested verbosity main() is called. |
|
381 logger = Logger([(Logger.LEVELS[-1], sys.stdout)]) |
|
382 |
|
383 def mkdir(path): |
|
384 if not os.path.exists(path): |
|
385 logger.info('Creating %s', path) |
|
386 os.makedirs(path) |
|
387 else: |
|
388 logger.info('Directory %s already exists', path) |
|
389 |
|
390 def copyfileordir(src, dest): |
|
391 if os.path.isdir(src): |
|
392 shutil.copytree(src, dest, True) |
|
393 else: |
|
394 shutil.copy2(src, dest) |
|
395 |
|
396 def copyfile(src, dest, symlink=True): |
|
397 if not os.path.exists(src): |
|
398 # Some bad symlink in the src |
|
399 logger.warn('Cannot find file %s (bad symlink)', src) |
|
400 return |
|
401 if os.path.exists(dest): |
|
402 logger.debug('File %s already exists', dest) |
|
403 return |
|
404 if not os.path.exists(os.path.dirname(dest)): |
|
405 logger.info('Creating parent directories for %s' % os.path.dirname(dest)) |
|
406 os.makedirs(os.path.dirname(dest)) |
|
407 if not os.path.islink(src): |
|
408 srcpath = os.path.abspath(src) |
|
409 else: |
|
410 srcpath = os.readlink(src) |
|
411 if symlink and hasattr(os, 'symlink'): |
|
412 logger.info('Symlinking %s', dest) |
|
413 try: |
|
414 os.symlink(srcpath, dest) |
|
415 except (OSError, NotImplementedError): |
|
416 logger.info('Symlinking failed, copying to %s', dest) |
|
417 copyfileordir(src, dest) |
|
418 else: |
|
419 logger.info('Copying to %s', dest) |
|
420 copyfileordir(src, dest) |
|
421 |
|
422 def writefile(dest, content, overwrite=True): |
|
423 if not os.path.exists(dest): |
|
424 logger.info('Writing %s', dest) |
|
425 f = open(dest, 'wb') |
|
426 f.write(content.encode('utf-8')) |
|
427 f.close() |
|
428 return |
|
429 else: |
|
430 f = open(dest, 'rb') |
|
431 c = f.read() |
|
432 f.close() |
|
433 if c != content: |
|
434 if not overwrite: |
|
435 logger.notify('File %s exists with different content; not overwriting', dest) |
|
436 return |
|
437 logger.notify('Overwriting %s with new content', dest) |
|
438 f = open(dest, 'wb') |
|
439 f.write(content.encode('utf-8')) |
|
440 f.close() |
|
441 else: |
|
442 logger.info('Content %s already in place', dest) |
|
443 |
|
444 def rmtree(dir): |
|
445 if os.path.exists(dir): |
|
446 logger.notify('Deleting tree %s', dir) |
|
447 shutil.rmtree(dir) |
|
448 else: |
|
449 logger.info('Do not need to delete %s; already gone', dir) |
|
450 |
|
451 def make_exe(fn): |
|
452 if hasattr(os, 'chmod'): |
|
453 oldmode = os.stat(fn).st_mode & 0xFFF # 0o7777 |
|
454 newmode = (oldmode | 0x16D) & 0xFFF # 0o555, 0o7777 |
|
455 os.chmod(fn, newmode) |
|
456 logger.info('Changed mode of %s to %s', fn, oct(newmode)) |
|
457 |
|
458 def _find_file(filename, dirs): |
|
459 for dir in dirs: |
|
460 if os.path.exists(join(dir, filename)): |
|
461 return join(dir, filename) |
|
462 return filename |
|
463 |
|
464 def _install_req(py_executable, unzip=False, distribute=False, |
|
465 search_dirs=None, never_download=False): |
|
466 |
|
467 if search_dirs is None: |
|
468 search_dirs = file_search_dirs() |
|
469 |
|
470 if not distribute: |
|
471 setup_fn = 'setuptools-0.6c11-py%s.egg' % sys.version[:3] |
|
472 project_name = 'setuptools' |
|
473 bootstrap_script = EZ_SETUP_PY |
|
474 source = None |
|
475 else: |
|
476 setup_fn = None |
|
477 source = 'distribute-0.6.19.tar.gz' |
|
478 project_name = 'distribute' |
|
479 bootstrap_script = DISTRIBUTE_SETUP_PY |
|
480 |
|
481 # If we are running under -p, we need to remove the current |
|
482 # directory from sys.path temporarily here, so that we |
|
483 # definitely get the pkg_resources from the site directory of |
|
484 # the interpreter we are running under, not the one |
|
485 # virtualenv.py is installed under (which might lead to py2/py3 |
|
486 # incompatibility issues) |
|
487 _prev_sys_path = sys.path |
|
488 if os.environ.get('VIRTUALENV_INTERPRETER_RUNNING'): |
|
489 sys.path = sys.path[1:] |
|
490 |
|
491 try: |
|
492 try: |
|
493 # check if the global Python has distribute installed or plain |
|
494 # setuptools |
|
495 import pkg_resources |
|
496 if not hasattr(pkg_resources, '_distribute'): |
|
497 location = os.path.dirname(pkg_resources.__file__) |
|
498 logger.notify("A globally installed setuptools was found (in %s)" % location) |
|
499 logger.notify("Use the --no-site-packages option to use distribute in " |
|
500 "the virtualenv.") |
|
501 except ImportError: |
|
502 pass |
|
503 finally: |
|
504 sys.path = _prev_sys_path |
|
505 |
|
506 if setup_fn is not None: |
|
507 setup_fn = _find_file(setup_fn, search_dirs) |
|
508 |
|
509 if source is not None: |
|
510 source = _find_file(source, search_dirs) |
|
511 |
|
512 if is_jython and os._name == 'nt': |
|
513 # Jython's .bat sys.executable can't handle a command line |
|
514 # argument with newlines |
|
515 fd, ez_setup = tempfile.mkstemp('.py') |
|
516 os.write(fd, bootstrap_script) |
|
517 os.close(fd) |
|
518 cmd = [py_executable, ez_setup] |
|
519 else: |
|
520 cmd = [py_executable, '-c', bootstrap_script] |
|
521 if unzip: |
|
522 cmd.append('--always-unzip') |
|
523 env = {} |
|
524 remove_from_env = [] |
|
525 if logger.stdout_level_matches(logger.DEBUG): |
|
526 cmd.append('-v') |
|
527 |
|
528 old_chdir = os.getcwd() |
|
529 if setup_fn is not None and os.path.exists(setup_fn): |
|
530 logger.info('Using existing %s egg: %s' % (project_name, setup_fn)) |
|
531 cmd.append(setup_fn) |
|
532 if os.environ.get('PYTHONPATH'): |
|
533 env['PYTHONPATH'] = setup_fn + os.path.pathsep + os.environ['PYTHONPATH'] |
|
534 else: |
|
535 env['PYTHONPATH'] = setup_fn |
|
536 else: |
|
537 # the source is found, let's chdir |
|
538 if source is not None and os.path.exists(source): |
|
539 logger.info('Using existing %s egg: %s' % (project_name, source)) |
|
540 os.chdir(os.path.dirname(source)) |
|
541 # in this case, we want to be sure that PYTHONPATH is unset (not |
|
542 # just empty, really unset), else CPython tries to import the |
|
543 # site.py that it's in virtualenv_support |
|
544 remove_from_env.append('PYTHONPATH') |
|
545 else: |
|
546 if never_download: |
|
547 logger.fatal("Can't find any local distributions of %s to install " |
|
548 "and --never-download is set. Either re-run virtualenv " |
|
549 "without the --never-download option, or place a %s " |
|
550 "distribution (%s) in one of these " |
|
551 "locations: %r" % (project_name, project_name, |
|
552 setup_fn or source, |
|
553 search_dirs)) |
|
554 sys.exit(1) |
|
555 |
|
556 logger.info('No %s egg found; downloading' % project_name) |
|
557 cmd.extend(['--always-copy', '-U', project_name]) |
|
558 logger.start_progress('Installing %s...' % project_name) |
|
559 logger.indent += 2 |
|
560 cwd = None |
|
561 if project_name == 'distribute': |
|
562 env['DONT_PATCH_SETUPTOOLS'] = 'true' |
|
563 |
|
564 def _filter_ez_setup(line): |
|
565 return filter_ez_setup(line, project_name) |
|
566 |
|
567 if not os.access(os.getcwd(), os.W_OK): |
|
568 cwd = tempfile.mkdtemp() |
|
569 if source is not None and os.path.exists(source): |
|
570 # the current working dir is hostile, let's copy the |
|
571 # tarball to a temp dir |
|
572 target = os.path.join(cwd, os.path.split(source)[-1]) |
|
573 shutil.copy(source, target) |
|
574 try: |
|
575 call_subprocess(cmd, show_stdout=False, |
|
576 filter_stdout=_filter_ez_setup, |
|
577 extra_env=env, |
|
578 remove_from_env=remove_from_env, |
|
579 cwd=cwd) |
|
580 finally: |
|
581 logger.indent -= 2 |
|
582 logger.end_progress() |
|
583 if os.getcwd() != old_chdir: |
|
584 os.chdir(old_chdir) |
|
585 if is_jython and os._name == 'nt': |
|
586 os.remove(ez_setup) |
|
587 |
|
588 def file_search_dirs(): |
|
589 here = os.path.dirname(os.path.abspath(__file__)) |
|
590 dirs = ['.', here, |
|
591 join(here, 'virtualenv_support')] |
|
592 if os.path.splitext(os.path.dirname(__file__))[0] != 'virtualenv': |
|
593 # Probably some boot script; just in case virtualenv is installed... |
|
594 try: |
|
595 import virtualenv |
|
596 except ImportError: |
|
597 pass |
|
598 else: |
|
599 dirs.append(os.path.join(os.path.dirname(virtualenv.__file__), 'virtualenv_support')) |
|
600 return [d for d in dirs if os.path.isdir(d)] |
|
601 |
|
602 def install_setuptools(py_executable, unzip=False, |
|
603 search_dirs=None, never_download=False): |
|
604 _install_req(py_executable, unzip, |
|
605 search_dirs=search_dirs, never_download=never_download) |
|
606 |
|
607 def install_distribute(py_executable, unzip=False, |
|
608 search_dirs=None, never_download=False): |
|
609 _install_req(py_executable, unzip, distribute=True, |
|
610 search_dirs=search_dirs, never_download=never_download) |
|
611 |
|
612 _pip_re = re.compile(r'^pip-.*(zip|tar.gz|tar.bz2|tgz|tbz)$', re.I) |
|
613 def install_pip(py_executable, search_dirs=None, never_download=False): |
|
614 if search_dirs is None: |
|
615 search_dirs = file_search_dirs() |
|
616 |
|
617 filenames = [] |
|
618 for dir in search_dirs: |
|
619 filenames.extend([join(dir, fn) for fn in os.listdir(dir) |
|
620 if _pip_re.search(fn)]) |
|
621 filenames = [(os.path.basename(filename).lower(), i, filename) for i, filename in enumerate(filenames)] |
|
622 filenames.sort() |
|
623 filenames = [filename for basename, i, filename in filenames] |
|
624 if not filenames: |
|
625 filename = 'pip' |
|
626 else: |
|
627 filename = filenames[-1] |
|
628 easy_install_script = 'easy_install' |
|
629 if sys.platform == 'win32': |
|
630 easy_install_script = 'easy_install-script.py' |
|
631 cmd = [py_executable, join(os.path.dirname(py_executable), easy_install_script), filename] |
|
632 if filename == 'pip': |
|
633 if never_download: |
|
634 logger.fatal("Can't find any local distributions of pip to install " |
|
635 "and --never-download is set. Either re-run virtualenv " |
|
636 "without the --never-download option, or place a pip " |
|
637 "source distribution (zip/tar.gz/tar.bz2) in one of these " |
|
638 "locations: %r" % search_dirs) |
|
639 sys.exit(1) |
|
640 logger.info('Installing pip from network...') |
|
641 else: |
|
642 logger.info('Installing existing %s distribution: %s' % ( |
|
643 os.path.basename(filename), filename)) |
|
644 logger.start_progress('Installing pip...') |
|
645 logger.indent += 2 |
|
646 def _filter_setup(line): |
|
647 return filter_ez_setup(line, 'pip') |
|
648 try: |
|
649 call_subprocess(cmd, show_stdout=False, |
|
650 filter_stdout=_filter_setup) |
|
651 finally: |
|
652 logger.indent -= 2 |
|
653 logger.end_progress() |
|
654 |
|
655 def filter_ez_setup(line, project_name='setuptools'): |
|
656 if not line.strip(): |
|
657 return Logger.DEBUG |
|
658 if project_name == 'distribute': |
|
659 for prefix in ('Extracting', 'Now working', 'Installing', 'Before', |
|
660 'Scanning', 'Setuptools', 'Egg', 'Already', |
|
661 'running', 'writing', 'reading', 'installing', |
|
662 'creating', 'copying', 'byte-compiling', 'removing', |
|
663 'Processing'): |
|
664 if line.startswith(prefix): |
|
665 return Logger.DEBUG |
|
666 return Logger.DEBUG |
|
667 for prefix in ['Reading ', 'Best match', 'Processing setuptools', |
|
668 'Copying setuptools', 'Adding setuptools', |
|
669 'Installing ', 'Installed ']: |
|
670 if line.startswith(prefix): |
|
671 return Logger.DEBUG |
|
672 return Logger.INFO |
|
673 |
|
674 def main(): |
|
675 parser = optparse.OptionParser( |
|
676 version=virtualenv_version, |
|
677 usage="%prog [OPTIONS] DEST_DIR") |
|
678 |
|
679 parser.add_option( |
|
680 '-v', '--verbose', |
|
681 action='count', |
|
682 dest='verbose', |
|
683 default=0, |
|
684 help="Increase verbosity") |
|
685 |
|
686 parser.add_option( |
|
687 '-q', '--quiet', |
|
688 action='count', |
|
689 dest='quiet', |
|
690 default=0, |
|
691 help='Decrease verbosity') |
|
692 |
|
693 parser.add_option( |
|
694 '-p', '--python', |
|
695 dest='python', |
|
696 metavar='PYTHON_EXE', |
|
697 help='The Python interpreter to use, e.g., --python=python2.5 will use the python2.5 ' |
|
698 'interpreter to create the new environment. The default is the interpreter that ' |
|
699 'virtualenv was installed with (%s)' % sys.executable) |
|
700 |
|
701 parser.add_option( |
|
702 '--clear', |
|
703 dest='clear', |
|
704 action='store_true', |
|
705 help="Clear out the non-root install and start from scratch") |
|
706 |
|
707 parser.add_option( |
|
708 '--no-site-packages', |
|
709 dest='no_site_packages', |
|
710 action='store_true', |
|
711 help="Don't give access to the global site-packages dir to the " |
|
712 "virtual environment") |
|
713 |
|
714 parser.add_option( |
|
715 '--unzip-setuptools', |
|
716 dest='unzip_setuptools', |
|
717 action='store_true', |
|
718 help="Unzip Setuptools or Distribute when installing it") |
|
719 |
|
720 parser.add_option( |
|
721 '--relocatable', |
|
722 dest='relocatable', |
|
723 action='store_true', |
|
724 help='Make an EXISTING virtualenv environment relocatable. ' |
|
725 'This fixes up scripts and makes all .pth files relative') |
|
726 |
|
727 parser.add_option( |
|
728 '--distribute', |
|
729 dest='use_distribute', |
|
730 action='store_true', |
|
731 help='Use Distribute instead of Setuptools. Set environ variable ' |
|
732 'VIRTUALENV_USE_DISTRIBUTE to make it the default ') |
|
733 |
|
734 default_search_dirs = file_search_dirs() |
|
735 parser.add_option( |
|
736 '--extra-search-dir', |
|
737 dest="search_dirs", |
|
738 action="append", |
|
739 default=default_search_dirs, |
|
740 help="Directory to look for setuptools/distribute/pip distributions in. " |
|
741 "You can add any number of additional --extra-search-dir paths.") |
|
742 |
|
743 parser.add_option( |
|
744 '--never-download', |
|
745 dest="never_download", |
|
746 action="store_true", |
|
747 help="Never download anything from the network. Instead, virtualenv will fail " |
|
748 "if local distributions of setuptools/distribute/pip are not present.") |
|
749 |
|
750 parser.add_option( |
|
751 '--prompt=', |
|
752 dest='prompt', |
|
753 help='Provides an alternative prompt prefix for this environment') |
|
754 |
|
755 if 'extend_parser' in globals(): |
|
756 extend_parser(parser) |
|
757 |
|
758 options, args = parser.parse_args() |
|
759 |
|
760 global logger |
|
761 |
|
762 if 'adjust_options' in globals(): |
|
763 adjust_options(options, args) |
|
764 |
|
765 verbosity = options.verbose - options.quiet |
|
766 logger = Logger([(Logger.level_for_integer(2-verbosity), sys.stdout)]) |
|
767 |
|
768 if options.python and not os.environ.get('VIRTUALENV_INTERPRETER_RUNNING'): |
|
769 env = os.environ.copy() |
|
770 interpreter = resolve_interpreter(options.python) |
|
771 if interpreter == sys.executable: |
|
772 logger.warn('Already using interpreter %s' % interpreter) |
|
773 else: |
|
774 logger.notify('Running virtualenv with interpreter %s' % interpreter) |
|
775 env['VIRTUALENV_INTERPRETER_RUNNING'] = 'true' |
|
776 file = __file__ |
|
777 if file.endswith('.pyc'): |
|
778 file = file[:-1] |
|
779 popen = subprocess.Popen([interpreter, file] + sys.argv[1:], env=env) |
|
780 raise SystemExit(popen.wait()) |
|
781 |
|
782 if not args: |
|
783 print('You must provide a DEST_DIR') |
|
784 parser.print_help() |
|
785 sys.exit(2) |
|
786 if len(args) > 1: |
|
787 print('There must be only one argument: DEST_DIR (you gave %s)' % ( |
|
788 ' '.join(args))) |
|
789 parser.print_help() |
|
790 sys.exit(2) |
|
791 |
|
792 home_dir = args[0] |
|
793 |
|
794 if os.environ.get('WORKING_ENV'): |
|
795 logger.fatal('ERROR: you cannot run virtualenv while in a workingenv') |
|
796 logger.fatal('Please deactivate your workingenv, then re-run this script') |
|
797 sys.exit(3) |
|
798 |
|
799 if 'PYTHONHOME' in os.environ: |
|
800 logger.warn('PYTHONHOME is set. You *must* activate the virtualenv before using it') |
|
801 del os.environ['PYTHONHOME'] |
|
802 |
|
803 if options.relocatable: |
|
804 make_environment_relocatable(home_dir) |
|
805 return |
|
806 |
|
807 create_environment(home_dir, site_packages=not options.no_site_packages, clear=options.clear, |
|
808 unzip_setuptools=options.unzip_setuptools, |
|
809 use_distribute=options.use_distribute or majver > 2, |
|
810 prompt=options.prompt, |
|
811 search_dirs=options.search_dirs, |
|
812 never_download=options.never_download) |
|
813 if 'after_install' in globals(): |
|
814 after_install(options, home_dir) |
|
815 |
|
816 def call_subprocess(cmd, show_stdout=True, |
|
817 filter_stdout=None, cwd=None, |
|
818 raise_on_returncode=True, extra_env=None, |
|
819 remove_from_env=None): |
|
820 cmd_parts = [] |
|
821 for part in cmd: |
|
822 if len(part) > 45: |
|
823 part = part[:20]+"..."+part[-20:] |
|
824 if ' ' in part or '\n' in part or '"' in part or "'" in part: |
|
825 part = '"%s"' % part.replace('"', '\\"') |
|
826 cmd_parts.append(part) |
|
827 cmd_desc = ' '.join(cmd_parts) |
|
828 if show_stdout: |
|
829 stdout = None |
|
830 else: |
|
831 stdout = subprocess.PIPE |
|
832 logger.debug("Running command %s" % cmd_desc) |
|
833 if extra_env or remove_from_env: |
|
834 env = os.environ.copy() |
|
835 if extra_env: |
|
836 env.update(extra_env) |
|
837 if remove_from_env: |
|
838 for varname in remove_from_env: |
|
839 env.pop(varname, None) |
|
840 else: |
|
841 env = None |
|
842 try: |
|
843 proc = subprocess.Popen( |
|
844 cmd, stderr=subprocess.STDOUT, stdin=None, stdout=stdout, |
|
845 cwd=cwd, env=env) |
|
846 except Exception: |
|
847 e = sys.exc_info()[1] |
|
848 logger.fatal( |
|
849 "Error %s while executing command %s" % (e, cmd_desc)) |
|
850 raise |
|
851 all_output = [] |
|
852 if stdout is not None: |
|
853 stdout = proc.stdout |
|
854 encoding = sys.getdefaultencoding() |
|
855 while 1: |
|
856 line = stdout.readline().decode(encoding) |
|
857 if not line: |
|
858 break |
|
859 line = line.rstrip() |
|
860 all_output.append(line) |
|
861 if filter_stdout: |
|
862 level = filter_stdout(line) |
|
863 if isinstance(level, tuple): |
|
864 level, line = level |
|
865 logger.log(level, line) |
|
866 if not logger.stdout_level_matches(level): |
|
867 logger.show_progress() |
|
868 else: |
|
869 logger.info(line) |
|
870 else: |
|
871 proc.communicate() |
|
872 proc.wait() |
|
873 if proc.returncode: |
|
874 if raise_on_returncode: |
|
875 if all_output: |
|
876 logger.notify('Complete output from command %s:' % cmd_desc) |
|
877 logger.notify('\n'.join(all_output) + '\n----------------------------------------') |
|
878 raise OSError( |
|
879 "Command %s failed with error code %s" |
|
880 % (cmd_desc, proc.returncode)) |
|
881 else: |
|
882 logger.warn( |
|
883 "Command %s had error code %s" |
|
884 % (cmd_desc, proc.returncode)) |
|
885 |
|
886 |
|
887 def create_environment(home_dir, site_packages=True, clear=False, |
|
888 unzip_setuptools=False, use_distribute=False, |
|
889 prompt=None, search_dirs=None, never_download=False): |
|
890 """ |
|
891 Creates a new environment in ``home_dir``. |
|
892 |
|
893 If ``site_packages`` is true (the default) then the global |
|
894 ``site-packages/`` directory will be on the path. |
|
895 |
|
896 If ``clear`` is true (default False) then the environment will |
|
897 first be cleared. |
|
898 """ |
|
899 home_dir, lib_dir, inc_dir, bin_dir = path_locations(home_dir) |
|
900 |
|
901 py_executable = os.path.abspath(install_python( |
|
902 home_dir, lib_dir, inc_dir, bin_dir, |
|
903 site_packages=site_packages, clear=clear)) |
|
904 |
|
905 install_distutils(home_dir) |
|
906 |
|
907 if use_distribute or os.environ.get('VIRTUALENV_USE_DISTRIBUTE'): |
|
908 install_distribute(py_executable, unzip=unzip_setuptools, |
|
909 search_dirs=search_dirs, never_download=never_download) |
|
910 else: |
|
911 install_setuptools(py_executable, unzip=unzip_setuptools, |
|
912 search_dirs=search_dirs, never_download=never_download) |
|
913 |
|
914 install_pip(py_executable, search_dirs=search_dirs, never_download=never_download) |
|
915 |
|
916 install_activate(home_dir, bin_dir, prompt) |
|
917 |
|
918 def path_locations(home_dir): |
|
919 """Return the path locations for the environment (where libraries are, |
|
920 where scripts go, etc)""" |
|
921 # XXX: We'd use distutils.sysconfig.get_python_inc/lib but its |
|
922 # prefix arg is broken: http://bugs.python.org/issue3386 |
|
923 if sys.platform == 'win32': |
|
924 # Windows has lots of problems with executables with spaces in |
|
925 # the name; this function will remove them (using the ~1 |
|
926 # format): |
|
927 mkdir(home_dir) |
|
928 if ' ' in home_dir: |
|
929 try: |
|
930 import win32api |
|
931 except ImportError: |
|
932 print('Error: the path "%s" has a space in it' % home_dir) |
|
933 print('To handle these kinds of paths, the win32api module must be installed:') |
|
934 print(' http://sourceforge.net/projects/pywin32/') |
|
935 sys.exit(3) |
|
936 home_dir = win32api.GetShortPathName(home_dir) |
|
937 lib_dir = join(home_dir, 'Lib') |
|
938 inc_dir = join(home_dir, 'Include') |
|
939 bin_dir = join(home_dir, 'Scripts') |
|
940 elif is_jython: |
|
941 lib_dir = join(home_dir, 'Lib') |
|
942 inc_dir = join(home_dir, 'Include') |
|
943 bin_dir = join(home_dir, 'bin') |
|
944 elif is_pypy: |
|
945 lib_dir = home_dir |
|
946 inc_dir = join(home_dir, 'include') |
|
947 bin_dir = join(home_dir, 'bin') |
|
948 else: |
|
949 lib_dir = join(home_dir, 'lib', py_version) |
|
950 inc_dir = join(home_dir, 'include', py_version + abiflags) |
|
951 bin_dir = join(home_dir, 'bin') |
|
952 return home_dir, lib_dir, inc_dir, bin_dir |
|
953 |
|
954 |
|
955 def change_prefix(filename, dst_prefix): |
|
956 prefixes = [sys.prefix] |
|
957 |
|
958 if sys.platform == "darwin": |
|
959 prefixes.extend(( |
|
960 os.path.join("/Library/Python", sys.version[:3], "site-packages"), |
|
961 os.path.join(sys.prefix, "Extras", "lib", "python"), |
|
962 os.path.join("~", "Library", "Python", sys.version[:3], "site-packages"))) |
|
963 |
|
964 if hasattr(sys, 'real_prefix'): |
|
965 prefixes.append(sys.real_prefix) |
|
966 prefixes = list(map(os.path.abspath, prefixes)) |
|
967 filename = os.path.abspath(filename) |
|
968 for src_prefix in prefixes: |
|
969 if filename.startswith(src_prefix): |
|
970 _, relpath = filename.split(src_prefix, 1) |
|
971 assert relpath[0] == os.sep |
|
972 relpath = relpath[1:] |
|
973 return join(dst_prefix, relpath) |
|
974 assert False, "Filename %s does not start with any of these prefixes: %s" % \ |
|
975 (filename, prefixes) |
|
976 |
|
977 def copy_required_modules(dst_prefix): |
|
978 import imp |
|
979 for modname in REQUIRED_MODULES: |
|
980 if modname in sys.builtin_module_names: |
|
981 logger.info("Ignoring built-in bootstrap module: %s" % modname) |
|
982 continue |
|
983 try: |
|
984 f, filename, _ = imp.find_module(modname) |
|
985 except ImportError: |
|
986 logger.info("Cannot import bootstrap module: %s" % modname) |
|
987 else: |
|
988 if f is not None: |
|
989 f.close() |
|
990 dst_filename = change_prefix(filename, dst_prefix) |
|
991 copyfile(filename, dst_filename) |
|
992 if filename.endswith('.pyc'): |
|
993 pyfile = filename[:-1] |
|
994 if os.path.exists(pyfile): |
|
995 copyfile(pyfile, dst_filename[:-1]) |
|
996 |
|
997 |
|
998 def install_python(home_dir, lib_dir, inc_dir, bin_dir, site_packages, clear): |
|
999 """Install just the base environment, no distutils patches etc""" |
|
1000 if sys.executable.startswith(bin_dir): |
|
1001 print('Please use the *system* python to run this script') |
|
1002 return |
|
1003 |
|
1004 if clear: |
|
1005 rmtree(lib_dir) |
|
1006 ## FIXME: why not delete it? |
|
1007 ## Maybe it should delete everything with #!/path/to/venv/python in it |
|
1008 logger.notify('Not deleting %s', bin_dir) |
|
1009 |
|
1010 if hasattr(sys, 'real_prefix'): |
|
1011 logger.notify('Using real prefix %r' % sys.real_prefix) |
|
1012 prefix = sys.real_prefix |
|
1013 else: |
|
1014 prefix = sys.prefix |
|
1015 mkdir(lib_dir) |
|
1016 fix_lib64(lib_dir) |
|
1017 fix_local_scheme(home_dir) |
|
1018 stdlib_dirs = [os.path.dirname(os.__file__)] |
|
1019 if sys.platform == 'win32': |
|
1020 stdlib_dirs.append(join(os.path.dirname(stdlib_dirs[0]), 'DLLs')) |
|
1021 elif sys.platform == 'darwin': |
|
1022 stdlib_dirs.append(join(stdlib_dirs[0], 'site-packages')) |
|
1023 if hasattr(os, 'symlink'): |
|
1024 logger.info('Symlinking Python bootstrap modules') |
|
1025 else: |
|
1026 logger.info('Copying Python bootstrap modules') |
|
1027 logger.indent += 2 |
|
1028 try: |
|
1029 # copy required files... |
|
1030 for stdlib_dir in stdlib_dirs: |
|
1031 if not os.path.isdir(stdlib_dir): |
|
1032 continue |
|
1033 for fn in os.listdir(stdlib_dir): |
|
1034 bn = os.path.splitext(fn)[0] |
|
1035 if fn != 'site-packages' and bn in REQUIRED_FILES: |
|
1036 copyfile(join(stdlib_dir, fn), join(lib_dir, fn)) |
|
1037 # ...and modules |
|
1038 copy_required_modules(home_dir) |
|
1039 finally: |
|
1040 logger.indent -= 2 |
|
1041 mkdir(join(lib_dir, 'site-packages')) |
|
1042 import site |
|
1043 site_filename = site.__file__ |
|
1044 if site_filename.endswith('.pyc'): |
|
1045 site_filename = site_filename[:-1] |
|
1046 elif site_filename.endswith('$py.class'): |
|
1047 site_filename = site_filename.replace('$py.class', '.py') |
|
1048 site_filename_dst = change_prefix(site_filename, home_dir) |
|
1049 site_dir = os.path.dirname(site_filename_dst) |
|
1050 writefile(site_filename_dst, SITE_PY) |
|
1051 writefile(join(site_dir, 'orig-prefix.txt'), prefix) |
|
1052 site_packages_filename = join(site_dir, 'no-global-site-packages.txt') |
|
1053 if not site_packages: |
|
1054 writefile(site_packages_filename, '') |
|
1055 else: |
|
1056 if os.path.exists(site_packages_filename): |
|
1057 logger.info('Deleting %s' % site_packages_filename) |
|
1058 os.unlink(site_packages_filename) |
|
1059 |
|
1060 if is_pypy or is_win: |
|
1061 stdinc_dir = join(prefix, 'include') |
|
1062 else: |
|
1063 stdinc_dir = join(prefix, 'include', py_version + abiflags) |
|
1064 if os.path.exists(stdinc_dir): |
|
1065 copyfile(stdinc_dir, inc_dir) |
|
1066 else: |
|
1067 logger.debug('No include dir %s' % stdinc_dir) |
|
1068 |
|
1069 # pypy never uses exec_prefix, just ignore it |
|
1070 if sys.exec_prefix != prefix and not is_pypy: |
|
1071 if sys.platform == 'win32': |
|
1072 exec_dir = join(sys.exec_prefix, 'lib') |
|
1073 elif is_jython: |
|
1074 exec_dir = join(sys.exec_prefix, 'Lib') |
|
1075 else: |
|
1076 exec_dir = join(sys.exec_prefix, 'lib', py_version) |
|
1077 for fn in os.listdir(exec_dir): |
|
1078 copyfile(join(exec_dir, fn), join(lib_dir, fn)) |
|
1079 |
|
1080 if is_jython: |
|
1081 # Jython has either jython-dev.jar and javalib/ dir, or just |
|
1082 # jython.jar |
|
1083 for name in 'jython-dev.jar', 'javalib', 'jython.jar': |
|
1084 src = join(prefix, name) |
|
1085 if os.path.exists(src): |
|
1086 copyfile(src, join(home_dir, name)) |
|
1087 # XXX: registry should always exist after Jython 2.5rc1 |
|
1088 src = join(prefix, 'registry') |
|
1089 if os.path.exists(src): |
|
1090 copyfile(src, join(home_dir, 'registry'), symlink=False) |
|
1091 copyfile(join(prefix, 'cachedir'), join(home_dir, 'cachedir'), |
|
1092 symlink=False) |
|
1093 |
|
1094 mkdir(bin_dir) |
|
1095 py_executable = join(bin_dir, os.path.basename(sys.executable)) |
|
1096 if 'Python.framework' in prefix: |
|
1097 if re.search(r'/Python(?:-32|-64)*$', py_executable): |
|
1098 # The name of the python executable is not quite what |
|
1099 # we want, rename it. |
|
1100 py_executable = os.path.join( |
|
1101 os.path.dirname(py_executable), 'python') |
|
1102 |
|
1103 logger.notify('New %s executable in %s', expected_exe, py_executable) |
|
1104 if sys.executable != py_executable: |
|
1105 ## FIXME: could I just hard link? |
|
1106 executable = sys.executable |
|
1107 if sys.platform == 'cygwin' and os.path.exists(executable + '.exe'): |
|
1108 # Cygwin misreports sys.executable sometimes |
|
1109 executable += '.exe' |
|
1110 py_executable += '.exe' |
|
1111 logger.info('Executable actually exists in %s' % executable) |
|
1112 shutil.copyfile(executable, py_executable) |
|
1113 make_exe(py_executable) |
|
1114 if sys.platform == 'win32' or sys.platform == 'cygwin': |
|
1115 pythonw = os.path.join(os.path.dirname(sys.executable), 'pythonw.exe') |
|
1116 if os.path.exists(pythonw): |
|
1117 logger.info('Also created pythonw.exe') |
|
1118 shutil.copyfile(pythonw, os.path.join(os.path.dirname(py_executable), 'pythonw.exe')) |
|
1119 if is_pypy: |
|
1120 # make a symlink python --> pypy-c |
|
1121 python_executable = os.path.join(os.path.dirname(py_executable), 'python') |
|
1122 logger.info('Also created executable %s' % python_executable) |
|
1123 copyfile(py_executable, python_executable) |
|
1124 |
|
1125 if os.path.splitext(os.path.basename(py_executable))[0] != expected_exe: |
|
1126 secondary_exe = os.path.join(os.path.dirname(py_executable), |
|
1127 expected_exe) |
|
1128 py_executable_ext = os.path.splitext(py_executable)[1] |
|
1129 if py_executable_ext == '.exe': |
|
1130 # python2.4 gives an extension of '.4' :P |
|
1131 secondary_exe += py_executable_ext |
|
1132 if os.path.exists(secondary_exe): |
|
1133 logger.warn('Not overwriting existing %s script %s (you must use %s)' |
|
1134 % (expected_exe, secondary_exe, py_executable)) |
|
1135 else: |
|
1136 logger.notify('Also creating executable in %s' % secondary_exe) |
|
1137 shutil.copyfile(sys.executable, secondary_exe) |
|
1138 make_exe(secondary_exe) |
|
1139 |
|
1140 if 'Python.framework' in prefix: |
|
1141 logger.debug('MacOSX Python framework detected') |
|
1142 |
|
1143 # Make sure we use the the embedded interpreter inside |
|
1144 # the framework, even if sys.executable points to |
|
1145 # the stub executable in ${sys.prefix}/bin |
|
1146 # See http://groups.google.com/group/python-virtualenv/ |
|
1147 # browse_thread/thread/17cab2f85da75951 |
|
1148 original_python = os.path.join( |
|
1149 prefix, 'Resources/Python.app/Contents/MacOS/Python') |
|
1150 shutil.copy(original_python, py_executable) |
|
1151 |
|
1152 # Copy the framework's dylib into the virtual |
|
1153 # environment |
|
1154 virtual_lib = os.path.join(home_dir, '.Python') |
|
1155 |
|
1156 if os.path.exists(virtual_lib): |
|
1157 os.unlink(virtual_lib) |
|
1158 copyfile( |
|
1159 os.path.join(prefix, 'Python'), |
|
1160 virtual_lib) |
|
1161 |
|
1162 # And then change the install_name of the copied python executable |
|
1163 try: |
|
1164 call_subprocess( |
|
1165 ["install_name_tool", "-change", |
|
1166 os.path.join(prefix, 'Python'), |
|
1167 '@executable_path/../.Python', |
|
1168 py_executable]) |
|
1169 except: |
|
1170 logger.fatal( |
|
1171 "Could not call install_name_tool -- you must have Apple's development tools installed") |
|
1172 raise |
|
1173 |
|
1174 # Some tools depend on pythonX.Y being present |
|
1175 py_executable_version = '%s.%s' % ( |
|
1176 sys.version_info[0], sys.version_info[1]) |
|
1177 if not py_executable.endswith(py_executable_version): |
|
1178 # symlinking pythonX.Y > python |
|
1179 pth = py_executable + '%s.%s' % ( |
|
1180 sys.version_info[0], sys.version_info[1]) |
|
1181 if os.path.exists(pth): |
|
1182 os.unlink(pth) |
|
1183 os.symlink('python', pth) |
|
1184 else: |
|
1185 # reverse symlinking python -> pythonX.Y (with --python) |
|
1186 pth = join(bin_dir, 'python') |
|
1187 if os.path.exists(pth): |
|
1188 os.unlink(pth) |
|
1189 os.symlink(os.path.basename(py_executable), pth) |
|
1190 |
|
1191 if sys.platform == 'win32' and ' ' in py_executable: |
|
1192 # There's a bug with subprocess on Windows when using a first |
|
1193 # argument that has a space in it. Instead we have to quote |
|
1194 # the value: |
|
1195 py_executable = '"%s"' % py_executable |
|
1196 cmd = [py_executable, '-c', 'import sys; print(sys.prefix)'] |
|
1197 logger.info('Testing executable with %s %s "%s"' % tuple(cmd)) |
|
1198 try: |
|
1199 proc = subprocess.Popen(cmd, |
|
1200 stdout=subprocess.PIPE) |
|
1201 proc_stdout, proc_stderr = proc.communicate() |
|
1202 except OSError: |
|
1203 e = sys.exc_info()[1] |
|
1204 if e.errno == errno.EACCES: |
|
1205 logger.fatal('ERROR: The executable %s could not be run: %s' % (py_executable, e)) |
|
1206 sys.exit(100) |
|
1207 else: |
|
1208 raise e |
|
1209 |
|
1210 proc_stdout = proc_stdout.strip().decode(sys.getdefaultencoding()) |
|
1211 proc_stdout = os.path.normcase(os.path.abspath(proc_stdout)) |
|
1212 if proc_stdout != os.path.normcase(os.path.abspath(home_dir)): |
|
1213 logger.fatal( |
|
1214 'ERROR: The executable %s is not functioning' % py_executable) |
|
1215 logger.fatal( |
|
1216 'ERROR: It thinks sys.prefix is %r (should be %r)' |
|
1217 % (proc_stdout, os.path.normcase(os.path.abspath(home_dir)))) |
|
1218 logger.fatal( |
|
1219 'ERROR: virtualenv is not compatible with this system or executable') |
|
1220 if sys.platform == 'win32': |
|
1221 logger.fatal( |
|
1222 'Note: some Windows users have reported this error when they installed Python for "Only this user". The problem may be resolvable if you install Python "For all users". (See https://bugs.launchpad.net/virtualenv/+bug/352844)') |
|
1223 sys.exit(100) |
|
1224 else: |
|
1225 logger.info('Got sys.prefix result: %r' % proc_stdout) |
|
1226 |
|
1227 pydistutils = os.path.expanduser('~/.pydistutils.cfg') |
|
1228 if os.path.exists(pydistutils): |
|
1229 logger.notify('Please make sure you remove any previous custom paths from ' |
|
1230 'your %s file.' % pydistutils) |
|
1231 ## FIXME: really this should be calculated earlier |
|
1232 return py_executable |
|
1233 |
|
1234 def install_activate(home_dir, bin_dir, prompt=None): |
|
1235 if sys.platform == 'win32' or is_jython and os._name == 'nt': |
|
1236 files = {'activate.bat': ACTIVATE_BAT, |
|
1237 'deactivate.bat': DEACTIVATE_BAT} |
|
1238 if os.environ.get('OS') == 'Windows_NT' and os.environ.get('OSTYPE') == 'cygwin': |
|
1239 files['activate'] = ACTIVATE_SH |
|
1240 else: |
|
1241 files = {'activate': ACTIVATE_SH} |
|
1242 |
|
1243 # suppling activate.fish in addition to, not instead of, the |
|
1244 # bash script support. |
|
1245 files['activate.fish'] = ACTIVATE_FISH |
|
1246 |
|
1247 # same for csh/tcsh support... |
|
1248 files['activate.csh'] = ACTIVATE_CSH |
|
1249 |
|
1250 |
|
1251 |
|
1252 files['activate_this.py'] = ACTIVATE_THIS |
|
1253 vname = os.path.basename(os.path.abspath(home_dir)) |
|
1254 for name, content in files.items(): |
|
1255 content = content.replace('__VIRTUAL_PROMPT__', prompt or '') |
|
1256 content = content.replace('__VIRTUAL_WINPROMPT__', prompt or '(%s)' % vname) |
|
1257 content = content.replace('__VIRTUAL_ENV__', os.path.abspath(home_dir)) |
|
1258 content = content.replace('__VIRTUAL_NAME__', vname) |
|
1259 content = content.replace('__BIN_NAME__', os.path.basename(bin_dir)) |
|
1260 writefile(os.path.join(bin_dir, name), content) |
|
1261 |
|
1262 def install_distutils(home_dir): |
|
1263 distutils_path = change_prefix(distutils.__path__[0], home_dir) |
|
1264 mkdir(distutils_path) |
|
1265 ## FIXME: maybe this prefix setting should only be put in place if |
|
1266 ## there's a local distutils.cfg with a prefix setting? |
|
1267 home_dir = os.path.abspath(home_dir) |
|
1268 ## FIXME: this is breaking things, removing for now: |
|
1269 #distutils_cfg = DISTUTILS_CFG + "\n[install]\nprefix=%s\n" % home_dir |
|
1270 writefile(os.path.join(distutils_path, '__init__.py'), DISTUTILS_INIT) |
|
1271 writefile(os.path.join(distutils_path, 'distutils.cfg'), DISTUTILS_CFG, overwrite=False) |
|
1272 |
|
1273 def fix_local_scheme(home_dir): |
|
1274 """ |
|
1275 Platforms that use the "posix_local" install scheme (like Ubuntu with |
|
1276 Python 2.7) need to be given an additional "local" location, sigh. |
|
1277 """ |
|
1278 try: |
|
1279 import sysconfig |
|
1280 except ImportError: |
|
1281 pass |
|
1282 else: |
|
1283 if sysconfig._get_default_scheme() == 'posix_local': |
|
1284 local_path = os.path.join(home_dir, 'local') |
|
1285 if not os.path.exists(local_path): |
|
1286 os.symlink(os.path.abspath(home_dir), local_path) |
|
1287 |
|
1288 def fix_lib64(lib_dir): |
|
1289 """ |
|
1290 Some platforms (particularly Gentoo on x64) put things in lib64/pythonX.Y |
|
1291 instead of lib/pythonX.Y. If this is such a platform we'll just create a |
|
1292 symlink so lib64 points to lib |
|
1293 """ |
|
1294 if [p for p in distutils.sysconfig.get_config_vars().values() |
|
1295 if isinstance(p, basestring) and 'lib64' in p]: |
|
1296 logger.debug('This system uses lib64; symlinking lib64 to lib') |
|
1297 assert os.path.basename(lib_dir) == 'python%s' % sys.version[:3], ( |
|
1298 "Unexpected python lib dir: %r" % lib_dir) |
|
1299 lib_parent = os.path.dirname(lib_dir) |
|
1300 assert os.path.basename(lib_parent) == 'lib', ( |
|
1301 "Unexpected parent dir: %r" % lib_parent) |
|
1302 copyfile(lib_parent, os.path.join(os.path.dirname(lib_parent), 'lib64')) |
|
1303 |
|
1304 def resolve_interpreter(exe): |
|
1305 """ |
|
1306 If the executable given isn't an absolute path, search $PATH for the interpreter |
|
1307 """ |
|
1308 if os.path.abspath(exe) != exe: |
|
1309 paths = os.environ.get('PATH', '').split(os.pathsep) |
|
1310 for path in paths: |
|
1311 if os.path.exists(os.path.join(path, exe)): |
|
1312 exe = os.path.join(path, exe) |
|
1313 break |
|
1314 if not os.path.exists(exe): |
|
1315 logger.fatal('The executable %s (from --python=%s) does not exist' % (exe, exe)) |
|
1316 raise SystemExit(3) |
|
1317 if not is_executable(exe): |
|
1318 logger.fatal('The executable %s (from --python=%s) is not executable' % (exe, exe)) |
|
1319 raise SystemExit(3) |
|
1320 return exe |
|
1321 |
|
1322 def is_executable(exe): |
|
1323 """Checks a file is executable""" |
|
1324 return os.access(exe, os.X_OK) |
|
1325 |
|
1326 ############################################################ |
|
1327 ## Relocating the environment: |
|
1328 |
|
1329 def make_environment_relocatable(home_dir): |
|
1330 """ |
|
1331 Makes the already-existing environment use relative paths, and takes out |
|
1332 the #!-based environment selection in scripts. |
|
1333 """ |
|
1334 home_dir, lib_dir, inc_dir, bin_dir = path_locations(home_dir) |
|
1335 activate_this = os.path.join(bin_dir, 'activate_this.py') |
|
1336 if not os.path.exists(activate_this): |
|
1337 logger.fatal( |
|
1338 'The environment doesn\'t have a file %s -- please re-run virtualenv ' |
|
1339 'on this environment to update it' % activate_this) |
|
1340 fixup_scripts(home_dir) |
|
1341 fixup_pth_and_egg_link(home_dir) |
|
1342 ## FIXME: need to fix up distutils.cfg |
|
1343 |
|
1344 OK_ABS_SCRIPTS = ['python', 'python%s' % sys.version[:3], |
|
1345 'activate', 'activate.bat', 'activate_this.py'] |
|
1346 |
|
1347 def fixup_scripts(home_dir): |
|
1348 # This is what we expect at the top of scripts: |
|
1349 shebang = '#!%s/bin/python' % os.path.normcase(os.path.abspath(home_dir)) |
|
1350 # This is what we'll put: |
|
1351 new_shebang = '#!/usr/bin/env python%s' % sys.version[:3] |
|
1352 activate = "import os; activate_this=os.path.join(os.path.dirname(__file__), 'activate_this.py'); execfile(activate_this, dict(__file__=activate_this)); del os, activate_this" |
|
1353 if sys.platform == 'win32': |
|
1354 bin_suffix = 'Scripts' |
|
1355 else: |
|
1356 bin_suffix = 'bin' |
|
1357 bin_dir = os.path.join(home_dir, bin_suffix) |
|
1358 home_dir, lib_dir, inc_dir, bin_dir = path_locations(home_dir) |
|
1359 for filename in os.listdir(bin_dir): |
|
1360 filename = os.path.join(bin_dir, filename) |
|
1361 if not os.path.isfile(filename): |
|
1362 # ignore subdirs, e.g. .svn ones. |
|
1363 continue |
|
1364 f = open(filename, 'rb') |
|
1365 lines = f.readlines() |
|
1366 f.close() |
|
1367 if not lines: |
|
1368 logger.warn('Script %s is an empty file' % filename) |
|
1369 continue |
|
1370 if not lines[0].strip().startswith(shebang): |
|
1371 if os.path.basename(filename) in OK_ABS_SCRIPTS: |
|
1372 logger.debug('Cannot make script %s relative' % filename) |
|
1373 elif lines[0].strip() == new_shebang: |
|
1374 logger.info('Script %s has already been made relative' % filename) |
|
1375 else: |
|
1376 logger.warn('Script %s cannot be made relative (it\'s not a normal script that starts with %s)' |
|
1377 % (filename, shebang)) |
|
1378 continue |
|
1379 logger.notify('Making script %s relative' % filename) |
|
1380 lines = [new_shebang+'\n', activate+'\n'] + lines[1:] |
|
1381 f = open(filename, 'wb') |
|
1382 f.writelines(lines) |
|
1383 f.close() |
|
1384 |
|
1385 def fixup_pth_and_egg_link(home_dir, sys_path=None): |
|
1386 """Makes .pth and .egg-link files use relative paths""" |
|
1387 home_dir = os.path.normcase(os.path.abspath(home_dir)) |
|
1388 if sys_path is None: |
|
1389 sys_path = sys.path |
|
1390 for path in sys_path: |
|
1391 if not path: |
|
1392 path = '.' |
|
1393 if not os.path.isdir(path): |
|
1394 continue |
|
1395 path = os.path.normcase(os.path.abspath(path)) |
|
1396 if not path.startswith(home_dir): |
|
1397 logger.debug('Skipping system (non-environment) directory %s' % path) |
|
1398 continue |
|
1399 for filename in os.listdir(path): |
|
1400 filename = os.path.join(path, filename) |
|
1401 if filename.endswith('.pth'): |
|
1402 if not os.access(filename, os.W_OK): |
|
1403 logger.warn('Cannot write .pth file %s, skipping' % filename) |
|
1404 else: |
|
1405 fixup_pth_file(filename) |
|
1406 if filename.endswith('.egg-link'): |
|
1407 if not os.access(filename, os.W_OK): |
|
1408 logger.warn('Cannot write .egg-link file %s, skipping' % filename) |
|
1409 else: |
|
1410 fixup_egg_link(filename) |
|
1411 |
|
1412 def fixup_pth_file(filename): |
|
1413 lines = [] |
|
1414 prev_lines = [] |
|
1415 f = open(filename) |
|
1416 prev_lines = f.readlines() |
|
1417 f.close() |
|
1418 for line in prev_lines: |
|
1419 line = line.strip() |
|
1420 if (not line or line.startswith('#') or line.startswith('import ') |
|
1421 or os.path.abspath(line) != line): |
|
1422 lines.append(line) |
|
1423 else: |
|
1424 new_value = make_relative_path(filename, line) |
|
1425 if line != new_value: |
|
1426 logger.debug('Rewriting path %s as %s (in %s)' % (line, new_value, filename)) |
|
1427 lines.append(new_value) |
|
1428 if lines == prev_lines: |
|
1429 logger.info('No changes to .pth file %s' % filename) |
|
1430 return |
|
1431 logger.notify('Making paths in .pth file %s relative' % filename) |
|
1432 f = open(filename, 'w') |
|
1433 f.write('\n'.join(lines) + '\n') |
|
1434 f.close() |
|
1435 |
|
1436 def fixup_egg_link(filename): |
|
1437 f = open(filename) |
|
1438 link = f.read().strip() |
|
1439 f.close() |
|
1440 if os.path.abspath(link) != link: |
|
1441 logger.debug('Link in %s already relative' % filename) |
|
1442 return |
|
1443 new_link = make_relative_path(filename, link) |
|
1444 logger.notify('Rewriting link %s in %s as %s' % (link, filename, new_link)) |
|
1445 f = open(filename, 'w') |
|
1446 f.write(new_link) |
|
1447 f.close() |
|
1448 |
|
1449 def make_relative_path(source, dest, dest_is_directory=True): |
|
1450 """ |
|
1451 Make a filename relative, where the filename is dest, and it is |
|
1452 being referred to from the filename source. |
|
1453 |
|
1454 >>> make_relative_path('/usr/share/something/a-file.pth', |
|
1455 ... '/usr/share/another-place/src/Directory') |
|
1456 '../another-place/src/Directory' |
|
1457 >>> make_relative_path('/usr/share/something/a-file.pth', |
|
1458 ... '/home/user/src/Directory') |
|
1459 '../../../home/user/src/Directory' |
|
1460 >>> make_relative_path('/usr/share/a-file.pth', '/usr/share/') |
|
1461 './' |
|
1462 """ |
|
1463 source = os.path.dirname(source) |
|
1464 if not dest_is_directory: |
|
1465 dest_filename = os.path.basename(dest) |
|
1466 dest = os.path.dirname(dest) |
|
1467 dest = os.path.normpath(os.path.abspath(dest)) |
|
1468 source = os.path.normpath(os.path.abspath(source)) |
|
1469 dest_parts = dest.strip(os.path.sep).split(os.path.sep) |
|
1470 source_parts = source.strip(os.path.sep).split(os.path.sep) |
|
1471 while dest_parts and source_parts and dest_parts[0] == source_parts[0]: |
|
1472 dest_parts.pop(0) |
|
1473 source_parts.pop(0) |
|
1474 full_parts = ['..']*len(source_parts) + dest_parts |
|
1475 if not dest_is_directory: |
|
1476 full_parts.append(dest_filename) |
|
1477 if not full_parts: |
|
1478 # Special case for the current directory (otherwise it'd be '') |
|
1479 return './' |
|
1480 return os.path.sep.join(full_parts) |
|
1481 |
|
1482 |
|
1483 |
|
1484 ############################################################ |
|
1485 ## Bootstrap script creation: |
|
1486 |
|
1487 def create_bootstrap_script(extra_text, python_version=''): |
|
1488 """ |
|
1489 Creates a bootstrap script, which is like this script but with |
|
1490 extend_parser, adjust_options, and after_install hooks. |
|
1491 |
|
1492 This returns a string that (written to disk of course) can be used |
|
1493 as a bootstrap script with your own customizations. The script |
|
1494 will be the standard virtualenv.py script, with your extra text |
|
1495 added (your extra text should be Python code). |
|
1496 |
|
1497 If you include these functions, they will be called: |
|
1498 |
|
1499 ``extend_parser(optparse_parser)``: |
|
1500 You can add or remove options from the parser here. |
|
1501 |
|
1502 ``adjust_options(options, args)``: |
|
1503 You can change options here, or change the args (if you accept |
|
1504 different kinds of arguments, be sure you modify ``args`` so it is |
|
1505 only ``[DEST_DIR]``). |
|
1506 |
|
1507 ``after_install(options, home_dir)``: |
|
1508 |
|
1509 After everything is installed, this function is called. This |
|
1510 is probably the function you are most likely to use. An |
|
1511 example would be:: |
|
1512 |
|
1513 def after_install(options, home_dir): |
|
1514 subprocess.call([join(home_dir, 'bin', 'easy_install'), |
|
1515 'MyPackage']) |
|
1516 subprocess.call([join(home_dir, 'bin', 'my-package-script'), |
|
1517 'setup', home_dir]) |
|
1518 |
|
1519 This example immediately installs a package, and runs a setup |
|
1520 script from that package. |
|
1521 |
|
1522 If you provide something like ``python_version='2.4'`` then the |
|
1523 script will start with ``#!/usr/bin/env python2.4`` instead of |
|
1524 ``#!/usr/bin/env python``. You can use this when the script must |
|
1525 be run with a particular Python version. |
|
1526 """ |
|
1527 filename = __file__ |
|
1528 if filename.endswith('.pyc'): |
|
1529 filename = filename[:-1] |
|
1530 f = open(filename, 'rb') |
|
1531 content = f.read() |
|
1532 f.close() |
|
1533 py_exe = 'python%s' % python_version |
|
1534 content = (('#!/usr/bin/env %s\n' % py_exe) |
|
1535 + '## WARNING: This file is generated\n' |
|
1536 + content) |
|
1537 return content.replace('##EXT' 'END##', extra_text) |
|
1538 |
|
1539 import sys |
|
1540 sys.path.append('/Users/tc/dev/eclipse_workspace/regardssignes_hg/virtualenv/res/lib') |
|
1541 sys.path.append('/Users/tc/dev/eclipse_workspace/regardssignes_hg/virtualenv/web/res') |
|
1542 from res_create_env import generate_install_methods |
|
1543 adjust_options, extend_parser, after_install = generate_install_methods(path_locations, '/Users/tc/dev/eclipse_workspace/regardssignes_hg/virtualenv/res/src', Logger, call_subprocess) |
|
1544 |
|
1545 |
|
1546 def convert(s): |
|
1547 b = base64.b64decode(s.encode('ascii')) |
|
1548 return zlib.decompress(b).decode('utf-8') |
|
1549 |
|
1550 ##file site.py |
|
1551 SITE_PY = convert(""" |
|
1552 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 |
|
1687 """) |
|
1688 |
|
1689 ##file ez_setup.py |
|
1690 EZ_SETUP_PY = convert(""" |
|
1691 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 |
|
1757 BDaonX65d/fwEjNqlDjLVIvM9X+XVxF7 |
|
1758 """) |
|
1759 |
|
1760 ##file distribute_setup.py |
|
1761 DISTRIBUTE_SETUP_PY = convert(""" |
|
1762 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 |
|
1841 """) |
|
1842 |
|
1843 ##file activate.sh |
|
1844 ACTIVATE_SH = convert(""" |
|
1845 eJytVU1v4jAQPW9+xTT0ANVS1GsrDlRFAqmFqmG72m0rY5IJsRRslDiktNr/vuMQ8tFQpNU2B4I9 |
|
1846 H36eeW/SglkgYvBFiLBKYg0LhCRGD1KhA7BjlUQuwkLIHne12HCNNpz5kVrBgsfBmdWCrUrA5VIq |
|
1847 DVEiQWjwRISuDreW5eE+CtodeLeAnhZEGKMGFXqAciMiJVcoNWx4JPgixDjzEj48QVeCfcqmtzfs |
|
1848 cfww+zG4ZfeD2ciGF7gCHaDMPM1jtvuHXAsPfF2rSGeOxV4iDY5GUGb3xVEYv2aj6WQ0vRseAlMY |
|
1849 G5DKsAawwnQUXt2LQOYlzZoYByqhonqoqfxZf4BLD97i4DukgXADCPgGgdOLTK5arYxZB1xnrc9T |
|
1850 EQFcHoZEAa1gSQioo/TPV5FZrDlxJA+NzwF+Ek1UonOzFnKZp6k5mgLBqSkuuAGXS4whJb5xz/xs |
|
1851 wXCHjiVerAk5eh9Kfz1wqOldtVv9dkbscfjgjKeTA8XPrtaNauX5rInOxaHuOReNtpFjo1/OxdFG |
|
1852 5eY9hJ3L3jqcPJbATggXAemDLZX0MNZRYjSDH7C1wMHQh73DyYfTu8a0F9v+6D8W6XNnF1GEIXW/ |
|
1853 JrSKPOtnW1YFat9mrLJkzLbyIlTvYzV0RGXcaTBfVLx7jF2PJ2wyuBsydpm7VSVa4C4Zb6pFO2TR |
|
1854 huypCEPwuQjNftUrNl6GsYZzuFrrLdC9iJjQ3omAPBbcI2lsU77tUD43kw1NPZhTrnZWzuQKLomx |
|
1855 Rd4OXM1ByExVVkmoTwfBJ7Lt10Iq1Kgo23Bmd8Ib1KrGbsbO4Pp2yO4fpnf3s6MnZiwuiJuls1/L |
|
1856 Pu4yUCvhpA+vZaJvWWDTr0yFYYyVnHMqCEq+QniuYX225xmnzRENjbXACF3wkCYNVZ1mBwxoR9Iw |
|
1857 WAo3/36oSOTfgjwEEQKt15e9Xpqm52+oaXxszmnE9GLl65RH2OMmS6+u5acKxDmlPgj2eT5/gQOX |
|
1858 LLK0j1y0Uwbmn438VZkVpqlfNKa/YET/53j+99G8H8tUhr9ZSXs2 |
|
1859 """) |
|
1860 |
|
1861 ##file activate.fish |
|
1862 ACTIVATE_FISH = convert(""" |
|
1863 eJydVm1v4jgQ/s6vmA1wBxUE7X2stJVYlVWR2lK13d6d9laRk0yIr8HmbIe0++tvnIQQB9pbXT5A |
|
1864 Ys/LM55nZtyHx5RrSHiGsMm1gRAh1xhDwU0Kng8hFzMWGb5jBv2E69SDs0TJDdj3MxilxmzPZzP7 |
|
1865 pVPMMl+q9bjXh1eZQ8SEkAZULoAbiLnCyGSvvV6SC7IoBcS4Nw0wjcFbvJDcjiuTswzFDpiIQaHJ |
|
1866 lQAjQUi1YRmUboC2uZJig8J4PaCnT5IaDcgsbm/CjinOwgx1KcUTMEhhTgV4g2B1fRk8Le8fv86v |
|
1867 g7v545UHpZB9rKnp+gXsMhxLunIIpwVQxP/l9c/Hq9Xt1epm4R27bva6AJqN92G4YhbMG2i+LB+u |
|
1868 grv71c3dY7B6WtzfLy9bePbp0taDTXSwJQJszUnnp0y57mvpPcrF7ZODyhswtd59+/jdgw+fwBNS |
|
1869 xLSscksUPIDqwwNmCez3PpxGeyBYg6HE0YdcWBxcKczYzuVJi5Wu915vn5oWePCCoPUZBN5B7IgV |
|
1870 MCi54ZDLG7TUZ0HweXkb3M5vFmSpFm/gthhBx0UrveoPpv9AJ9unIbQYdUoe21bKg2q48sPFGVwu |
|
1871 H+afrxd1qvclaNlRFyh1EQ2sSccEuNAGWQwysfVpz1tPajUqbqJUnEcIJkWo6OXDaodK8ZiLdbmM |
|
1872 L1wb+9H0D+pcyPSrX5u5kgWSygRYXCnJUi/KKcuU4cqsAyTKZBiissLc7NFwizvjxtieKBVCIdWz |
|
1873 fzilzPaYyljZN0cGN1v7NnaIPNCGmVy3GKuJaQ6iVjE1Qfm+36hglErwmnAD8hu0dDy4uICBA8ZV |
|
1874 pQr/q/+O0KFW2kjelu9Dgb9SDBsWV4F4x5CswgS0zBVlk5tDMP5bVtUGpslbm81Lu2sdKq7uNMGh |
|
1875 MVQ4fy9xhogC1lS5guhISa0DlBWv0O8odT6/LP+4WZzDV6FzIkEqC0uolGZSZoMnlpxplmD2euaT |
|
1876 O4hkTpPnbztDccey0bhjDaBIqaWQa0uwEtQEwtyU56i4fq54F9IE3ORR6mKriODM4XOYZwaVYLYz |
|
1877 7SPbKkz4i7VkB6/Ot1upDE3znNqYKpM8raa0Bx8vfvntJ32UENsM4aI6gJL+jJwhxhh3jVIDOcpi |
|
1878 m0r2hmEtS8XXXNBk71QCDXTBNhhPiHX2LtHkrVIlhoEshH/EZgdq53Eirqs5iFKMnkOmqZTtr3Xq |
|
1879 djvPTWZT4S3NT5aVLgurMPUWI07BRVYqkQrmtCKohNY8qu9EdACoT6ki0a66XxVF4f9AQ3W38yO5 |
|
1880 mWmZmIIpnDFrbXakvKWeZhLwhvrbUH8fahhqD0YUcBDJjEBMQwiznE4y5QbHrbhHBOnUAYzb2tVN |
|
1881 jJa65e+eE2Ya30E2GurxUP8ssA6e/wOnvo3V78d3vTcvMB3n7l3iX1JXWqk= |
|
1882 """) |
|
1883 |
|
1884 ##file activate.csh |
|
1885 ACTIVATE_CSH = convert(""" |
|
1886 eJx9U11vmzAUffevOCVRu+UB9pws29Kl0iq1aVWllaZlcgxciiViItsQdb9+xiQp+dh4QOB7Pu49 |
|
1887 XHqY59IgkwVhVRmLmFAZSrGRNkdgykonhFiqSCRW1sJSmJg8wCDT5QrucRCyHn6WFRKhVGmhKwVp |
|
1888 kUpNiS3emup3TY6XIn7DVNQyJUwlrgthJD6n/iCNv72uhCzCpFx9CRkThRQGKe08cWXJ9db/yh/u |
|
1889 pvzl9mn+PLnjj5P5D1yM8QmXlzBkSdXwZ0H/BBc0mEo5FE5qI2jKhclHOOvy9HD/OO/6YO1mX9vx |
|
1890 sY0H/tPIV0dtqel0V7iZvWyNg8XFcBA0ToEqVeqOdNUEQFvN41SumAv32VtJrakQNSmLWmgp4oJM |
|
1891 yDoBHgoydtoEAs47r5wHHnUal5vbJ8oOI+9wI86vb2d8Nrm/4Xy4RZ8R85E4uTZPB5EZPnTaaAGu |
|
1892 E59J8BE2J8XgrkbLeXMlVoQxznEYFYY8uFFdxsKQRx90Giwx9vSueHP1YNaUSFG4vTaErNSYuBOF |
|
1893 lXiVyXa9Sy3JdClEyK1dD6Nos9mEf8iKlOpmqSNTZnYjNEWiUYn2pKNB3ttcLJ3HmYYXy6Un76f7 |
|
1894 r8rRsC1TpTJj7f19m5sUf/V3Ir+x/yjtLu8KjLX/CmN/AcVGUUo= |
|
1895 """) |
|
1896 |
|
1897 ##file activate.bat |
|
1898 ACTIVATE_BAT = convert(""" |
|
1899 eJyFUkEKgzAQvAfyhz0YaL9QEWpRqlSjWGspFPZQTevFHOr/adQaU1GaUzI7Mzu7ZF89XhKkEJS8 |
|
1900 qxaKMMsvboQ+LxxE44VICSW1gEa2UFaibqoS0iyJ0xw2lIA6nX5AHCu1jpRsv5KRjknkac9VLVug |
|
1901 sX9mtzxIeJDE/mg4OGp47qoLo3NHX2jsMB3AiDht5hryAUOEifoTdCXbSh7V0My2NMq/Xbh5MEjU |
|
1902 ZT63gpgNT9lKOJ/CtHsvT99re3pX303kydn4HeyOeAg5cjf2EW1D6HOPkg9NGKhu |
|
1903 """) |
|
1904 |
|
1905 ##file deactivate.bat |
|
1906 DEACTIVATE_BAT = convert(""" |
|
1907 eJxzSE3OyFfIT0vj4spMU0hJTcvMS01RiPf3cYkP8wwKCXX0iQ8I8vcNCFHQ4FIAguLUEgWIgK0q |
|
1908 FlWqXJpcICVYpGzx2BAZ4uHv5+Hv6wq1BWINXBTdKriEKkI1DhW2QAfhttcxxANiFZCBbglQSJUL |
|
1909 i2dASrm4rFz9XLgAwJNbyQ== |
|
1910 """) |
|
1911 |
|
1912 ##file distutils-init.py |
|
1913 DISTUTILS_INIT = convert(""" |
|
1914 eJytV92L4zYQf/dfMU0ottuse7RvC6FQrg8Lxz2Ugz4si9HacqKuIxlJ2ST313dG8odkO9d7aGBB |
|
1915 luZLv/nNjFacOqUtKJMIvzK3cXlhWgp5MDBsqK5SNYftsBAGpLLA4F1oe2Ytl+9wUvW55TswCi4c |
|
1916 KibhbFDSglXQCFmDPXIwtm7FawLRbwtPzg2T9gf4gupKv4GS0N262w7V0NvpbCy8cvTo3eAus6C5 |
|
1917 ETU3ICQZX1hFTw/dzR6V/AW1RCN4/XAtbsVXqIXmlVX6liS4lOzEYY9QFB2zx6LfoSNjz1a0pqT9 |
|
1918 QOIfJWQ2E888NEVZNqLlZZnvIB0NpHkimlFdKn2iRRY7yGG/CCJb6Iz280d34SFXBS2yEYPNF0Q7 |
|
1919 yM7oCjpWvbEDQmnhRwOs6zjThpKE8HogwRAgraqYFZgGZvzmzVh+mgz9vskT3hruwyjdFcqyENJw |
|
1920 bbMPO5jdzonxK68QKT7B57CMRRG5shRSWDTX3dI8LzRndZbnSWL1zfvriUmK4TcGWSnZiEPCrxXv |
|
1921 bM+sP7VW2is2WgWXCO3sAu3Rzysz3FiNCA8WPyM4gb1JAAmCiyTZbhFjWx3h9SzauuRXC9MFoVbc |
|
1922 yNTCm1QXOOIfIn/g1kGMhDUBN72hI5XCBQtIXQw8UEEdma6Jaz4vJIJ51Orc15hzzmu6TdFp3ogr |
|
1923 Aof0c98tsw1SiaiWotHffk3XYCkqdToxWRfTFXqgpg2khcLluOHMVC0zZhLKIomesfSreUNNgbXi |
|
1924 Ky9VRzwzkBneNoGQyyvGjbsFQqOZvpWIjqH281lJ/jireFgR3cPzSyTGWzQpDNIU+03Fs4XKLkhp |
|
1925 /n0uFnuF6VphB44b3uWRneSbBoMSioqE8oeF0JY+qTvYfEK+bPLYdoR4McfYQ7wMZj39q0kfP8q+ |
|
1926 FfsymO0GzNlPh644Jje06ulqHpOEQqdJUfoidI2O4CWx4qOglLye6RrFQirpCRXvhoRqXH3sYdVJ |
|
1927 AItvc+VUsLO2v2hVAWrNIfVGtkG351cUMNncbh/WdowtSPtCdkzYFv6mwYc9o2Jt68ud6wectBr8 |
|
1928 hYAulPSlgzH44YbV3ikjrulEaNJxt+/H3wZ7bXSXje/YY4tfVVrVmUstaDwwOBLMg6iduDB0lMVC |
|
1929 UyzYx7Ab4kjCqdViEJmDcdk/SKbgsjYXgfMznUWcrtS4z4fmJ/XOM1LPk/iIpqass5XwNbdnLb1Y |
|
1930 8h3ERXSWZI6rZJxKs1LBqVH65w0Oy4ra0CBYxEeuOMbDmV5GI6E0Ha/wgVTtkX0+OXvqsD02CKLf |
|
1931 XHbeft85D7tTCMYy2Njp4DJP7gWJr6paVWXZ1+/6YXLv/iE0M90FktiI7yFJD9e7SOLhEkkaMTUO |
|
1932 azq9i2woBNR0/0eoF1HFMf0H8ChxH/jgcB34GZIz3Qn4/vid+VEamQrOVqAPTrOfmD4MPdVh09tb |
|
1933 8dLLjvh/61lEP4yW5vJaH4vHcevG8agXvzPGoOhhXNncpTr99PTHx6e/UvffFLaxUSjuSeP286Dw |
|
1934 gtEMcW1xKr/he4/6IQ6FUXP+0gkioHY5iwC9Eyx3HKO7af0zPPe+XyLn7fAY78k4aiR387bCr5XT |
|
1935 5C4rFgwLGfMvJuAMew== |
|
1936 """) |
|
1937 |
|
1938 ##file distutils.cfg |
|
1939 DISTUTILS_CFG = convert(""" |
|
1940 eJxNj00KwkAMhfc9xYNuxe4Ft57AjYiUtDO1wXSmNJnK3N5pdSEEAu8nH6lxHVlRhtDHMPATA4uH |
|
1941 xJ4EFmGbvfJiicSHFRzUSISMY6hq3GLCRLnIvSTnEefN0FIjw5tF0Hkk9Q5dRunBsVoyFi24aaLg |
|
1942 9FDOlL0FPGluf4QjcInLlxd6f6rqkgPu/5nHLg0cXCscXoozRrP51DRT3j9QNl99AP53T2Q= |
|
1943 """) |
|
1944 |
|
1945 ##file activate_this.py |
|
1946 ACTIVATE_THIS = convert(""" |
|
1947 eJyNUlGL2zAMfvevEBlHEujSsXsL9GGDvW1jD3sZpQQ3Ua7aJXawnbT595Ocpe0dO5ghseVP+vRJ |
|
1948 VpIkn2cYPZknwAvWLXWYhRP5Sk4baKgOWRWNqtpdgTyH2Y5wpq5Tug406YAgKEzkwqg7NBPwR86a |
|
1949 Hk0olPopaK0NHJHzYQPnE5rI0o8+yBUwiBfyQcT8mMPJGiAT0A0O+b8BY4MKJ7zPcSSzHaKrSpJE |
|
1950 qeDmUgGvVbPCS41DgO+6xy/OWbfAThMn/OQ9ukDWRCSLiKzk1yrLjWapq6NnvHUoHXQ4bYPdrsVX |
|
1951 4lQMc/q6ZW975nmSK+oH6wL42a9H65U6aha342Mh0UVDzrD87C1bH73s16R5zsStkBZDp0NrXQ+7 |
|
1952 HaRnMo8f06UBnljKoOtn/YT+LtdvSyaT/BtIv9KR60nF9f3qmuYKO4//T9ItJMsjPfgUHqKwCZ3n |
|
1953 xu/Lx8M/UvCLTxW7VULHxB1PRRbrYfvWNY5S8it008jOjcleaMqVBDnUXcWULV2YK9JEQ92OfC96 |
|
1954 1Tv4ZicZZZ7GpuEpZbbeQ7DxquVx5hdqoyFSSmXwfC90f1Dc7hjFs/tK99I0fpkI8zSLy4tSy+sI |
|
1955 3vMWehjQNJmE5VePlZbL61nzX3S93ZcfDqznnkb9AZ3GWJU= |
|
1956 """) |
|
1957 |
|
1958 if __name__ == '__main__': |
|
1959 main() |
|
1960 |
|
1961 ## TODO: |
|
1962 ## Copy python.exe.manifest |
|
1963 ## Monkeypatch distutils.sysconfig |