virtualenv/web/virtualenv.py
changeset 165 64aae3fee9d5
parent 101 71532a54d1c4
child 172 5232f3f08654
equal deleted inserted replaced
164:4f77196ffde1 165:64aae3fee9d5
     1 #!/usr/bin/env python
     1 #!/usr/bin/env python
     2 """Create a "virtual" Python installation
     2 """Create a "virtual" Python installation
     3 """
     3 """
     4 
     4 
     5 __version__ = "1.10.1"
     5 __version__ = "1.11.4"
     6 virtualenv_version = __version__  # legacy
     6 virtualenv_version = __version__  # legacy
     7 
     7 
     8 import base64
     8 import base64
     9 import sys
     9 import sys
    10 import os
    10 import os
   128                              'shutil', 'struct', 'copy', 'tokenize', 'token',
   128                              'shutil', 'struct', 'copy', 'tokenize', 'token',
   129                              'functools', 'heapq', 'bisect', 'weakref',
   129                              'functools', 'heapq', 'bisect', 'weakref',
   130                              'reprlib'])
   130                              'reprlib'])
   131     if minver >= 2:
   131     if minver >= 2:
   132         REQUIRED_FILES[-1] = 'config-%s' % majver
   132         REQUIRED_FILES[-1] = 'config-%s' % majver
   133     if minver == 3:
   133     if minver >= 3:
   134         import sysconfig
   134         import sysconfig
   135         platdir = sysconfig.get_config_var('PLATDIR')
   135         platdir = sysconfig.get_config_var('PLATDIR')
   136         REQUIRED_FILES.append(platdir)
   136         REQUIRED_FILES.append(platdir)
   137         # The whole list of 3.3 modules is reproduced below - the current
   137         # The whole list of 3.3 modules is reproduced below - the current
   138         # uncommented ones are required for 3.3 as of now, but more may be
   138         # uncommented ones are required for 3.3 as of now, but more may be
   283             #"xdrlib",
   283             #"xdrlib",
   284             #"xml",
   284             #"xml",
   285             #"xmlrpc",
   285             #"xmlrpc",
   286             #"zipfile",
   286             #"zipfile",
   287         ])
   287         ])
       
   288     if minver >= 4:
       
   289         REQUIRED_MODULES.extend([
       
   290             'operator',
       
   291             '_collections_abc',
       
   292             '_bootlocale',
       
   293         ])
   288 
   294 
   289 if is_pypy:
   295 if is_pypy:
   290     # these are needed to correctly display the exceptions that may happen
   296     # these are needed to correctly display the exceptions that may happen
   291     # during the bootstrap
   297     # during the bootstrap
   292     REQUIRED_MODULES.extend(['traceback', 'linecache'])
   298     REQUIRED_MODULES.extend(['traceback', 'linecache'])
   644     parser.add_option(
   650     parser.add_option(
   645         '-v', '--verbose',
   651         '-v', '--verbose',
   646         action='count',
   652         action='count',
   647         dest='verbose',
   653         dest='verbose',
   648         default=0,
   654         default=0,
   649         help="Increase verbosity")
   655         help="Increase verbosity.")
   650 
   656 
   651     parser.add_option(
   657     parser.add_option(
   652         '-q', '--quiet',
   658         '-q', '--quiet',
   653         action='count',
   659         action='count',
   654         dest='quiet',
   660         dest='quiet',
   655         default=0,
   661         default=0,
   656         help='Decrease verbosity')
   662         help='Decrease verbosity.')
   657 
   663 
   658     parser.add_option(
   664     parser.add_option(
   659         '-p', '--python',
   665         '-p', '--python',
   660         dest='python',
   666         dest='python',
   661         metavar='PYTHON_EXE',
   667         metavar='PYTHON_EXE',
   665 
   671 
   666     parser.add_option(
   672     parser.add_option(
   667         '--clear',
   673         '--clear',
   668         dest='clear',
   674         dest='clear',
   669         action='store_true',
   675         action='store_true',
   670         help="Clear out the non-root install and start from scratch")
   676         help="Clear out the non-root install and start from scratch.")
   671 
   677 
   672     parser.set_defaults(system_site_packages=False)
   678     parser.set_defaults(system_site_packages=False)
   673     parser.add_option(
   679     parser.add_option(
   674         '--no-site-packages',
   680         '--no-site-packages',
   675         dest='system_site_packages',
   681         dest='system_site_packages',
   676         action='store_false',
   682         action='store_false',
   677         help="Don't give access to the global site-packages dir to the "
   683         help="DEPRECATED. Retained only for backward compatibility. "
   678              "virtual environment (default)")
   684              "Not having access to global site-packages is now the default behavior.")
   679 
   685 
   680     parser.add_option(
   686     parser.add_option(
   681         '--system-site-packages',
   687         '--system-site-packages',
   682         dest='system_site_packages',
   688         dest='system_site_packages',
   683         action='store_true',
   689         action='store_true',
   684         help="Give access to the global site-packages dir to the "
   690         help="Give the virtual environment access to the global site-packages.")
   685              "virtual environment")
       
   686 
   691 
   687     parser.add_option(
   692     parser.add_option(
   688         '--always-copy',
   693         '--always-copy',
   689         dest='symlink',
   694         dest='symlink',
   690         action='store_false',
   695         action='store_false',
   691         default=True,
   696         default=True,
   692         help="Always copy files rather than symlinking")
   697         help="Always copy files rather than symlinking.")
   693 
   698 
   694     parser.add_option(
   699     parser.add_option(
   695         '--unzip-setuptools',
   700         '--unzip-setuptools',
   696         dest='unzip_setuptools',
   701         dest='unzip_setuptools',
   697         action='store_true',
   702         action='store_true',
   698         help="Unzip Setuptools when installing it")
   703         help="Unzip Setuptools when installing it.")
   699 
   704 
   700     parser.add_option(
   705     parser.add_option(
   701         '--relocatable',
   706         '--relocatable',
   702         dest='relocatable',
   707         dest='relocatable',
   703         action='store_true',
   708         action='store_true',
   704         help='Make an EXISTING virtualenv environment relocatable.  '
   709         help='Make an EXISTING virtualenv environment relocatable. '
   705         'This fixes up scripts and makes all .pth files relative')
   710              'This fixes up scripts and makes all .pth files relative.')
   706 
   711 
   707     parser.add_option(
   712     parser.add_option(
   708         '--no-setuptools',
   713         '--no-setuptools',
   709         dest='no_setuptools',
   714         dest='no_setuptools',
   710         action='store_true',
   715         action='store_true',
   711         help='Do not install setuptools (or pip) '
   716         help='Do not install setuptools (or pip) in the new virtualenv.')
   712         'in the new virtualenv.')
       
   713 
   717 
   714     parser.add_option(
   718     parser.add_option(
   715         '--no-pip',
   719         '--no-pip',
   716         dest='no_pip',
   720         dest='no_pip',
   717         action='store_true',
   721         action='store_true',
   720     default_search_dirs = file_search_dirs()
   724     default_search_dirs = file_search_dirs()
   721     parser.add_option(
   725     parser.add_option(
   722         '--extra-search-dir',
   726         '--extra-search-dir',
   723         dest="search_dirs",
   727         dest="search_dirs",
   724         action="append",
   728         action="append",
       
   729         metavar='DIR',
   725         default=default_search_dirs,
   730         default=default_search_dirs,
   726         help="Directory to look for setuptools/pip distributions in. "
   731         help="Directory to look for setuptools/pip distributions in. "
   727         "You can add any number of additional --extra-search-dir paths.")
   732               "This option can be used multiple times.")
   728 
   733 
   729     parser.add_option(
   734     parser.add_option(
   730         '--never-download',
   735         '--never-download',
   731         dest="never_download",
   736         dest="never_download",
   732         action="store_true",
   737         action="store_true",
   733         default=True,
   738         default=True,
   734         help="Never download anything from the network. This is now always "
   739         help="DEPRECATED. Retained only for backward compatibility. This option has no effect. "
   735         "the case. The option is only retained for backward compatibility, "
   740               "Virtualenv never downloads pip or setuptools.")
   736         "and does nothing. Virtualenv will fail if local distributions "
       
   737         "of setuptools/pip are not present.")
       
   738 
   741 
   739     parser.add_option(
   742     parser.add_option(
   740         '--prompt',
   743         '--prompt',
   741         dest='prompt',
   744         dest='prompt',
   742         help='Provides an alternative prompt prefix for this environment')
   745         help='Provides an alternative prompt prefix for this environment.')
   743 
   746 
   744     parser.add_option(
   747     parser.add_option(
   745         '--setuptools',
   748         '--setuptools',
   746         dest='setuptools',
   749         dest='setuptools',
   747         action='store_true',
   750         action='store_true',
   748         help="Backward compatibility. Does nothing.")
   751         help="DEPRECATED. Retained only for backward compatibility. This option has no effect.")
   749 
   752 
   750     parser.add_option(
   753     parser.add_option(
   751         '--distribute',
   754         '--distribute',
   752         dest='distribute',
   755         dest='distribute',
   753         action='store_true',
   756         action='store_true',
   754         help="Backward compatibility. Does nothing.")
   757         help="DEPRECATED. Retained only for backward compatibility. This option has no effect.")
   755 
   758 
   756     if 'extend_parser' in globals():
   759     if 'extend_parser' in globals():
   757         extend_parser(parser)
   760         extend_parser(parser)
   758 
   761 
   759     options, args = parser.parse_args()
   762     options, args = parser.parse_args()
   905 def filter_install_output(line):
   908 def filter_install_output(line):
   906     if line.strip().startswith('running'):
   909     if line.strip().startswith('running'):
   907         return Logger.INFO
   910         return Logger.INFO
   908     return Logger.DEBUG
   911     return Logger.DEBUG
   909 
   912 
   910 def install_sdist(project_name, sdist, py_executable, search_dirs=None):
   913 def find_wheels(projects, search_dirs):
   911 
   914     """Find wheels from which we can import PROJECTS.
       
   915 
       
   916     Scan through SEARCH_DIRS for a wheel for each PROJECT in turn. Return
       
   917     a list of the first wheel found for each PROJECT
       
   918     """
       
   919 
       
   920     wheels = []
       
   921 
       
   922     # Look through SEARCH_DIRS for the first suitable wheel. Don't bother
       
   923     # about version checking here, as this is simply to get something we can
       
   924     # then use to install the correct version.
       
   925     for project in projects:
       
   926         for dirname in search_dirs:
       
   927             # This relies on only having "universal" wheels available.
       
   928             # The pattern could be tightened to require -py2.py3-none-any.whl.
       
   929             files = glob.glob(os.path.join(dirname, project + '-*.whl'))
       
   930             if files:
       
   931                 wheels.append(os.path.abspath(files[0]))
       
   932                 break
       
   933         else:
       
   934             # We're out of luck, so quit with a suitable error
       
   935             logger.fatal('Cannot find a wheel for %s' % (project,))
       
   936 
       
   937     return wheels
       
   938 
       
   939 def install_wheel(project_names, py_executable, search_dirs=None):
   912     if search_dirs is None:
   940     if search_dirs is None:
   913         search_dirs = file_search_dirs()
   941         search_dirs = file_search_dirs()
   914     found, sdist_path = _find_file(sdist, search_dirs)
   942 
   915     if not found:
   943     wheels = find_wheels(['setuptools', 'pip'], search_dirs)
   916         logger.fatal("Cannot find sdist %s" % (sdist,))
   944     pythonpath = os.pathsep.join(wheels)
   917         return
   945     findlinks = ' '.join(search_dirs)
   918 
   946 
   919     tmpdir = tempfile.mkdtemp()
   947     cmd = [
       
   948         py_executable, '-c',
       
   949         'import sys, pip; sys.exit(pip.main(["install", "--ignore-installed"] + sys.argv[1:]))',
       
   950     ] + project_names
       
   951     logger.start_progress('Installing %s...' % (', '.join(project_names)))
       
   952     logger.indent += 2
   920     try:
   953     try:
   921         tar = tarfile.open(sdist_path)
   954         call_subprocess(cmd, show_stdout=False,
   922         tar.extractall(tmpdir)
   955             extra_env = {
   923         tar.close()
   956                 'PYTHONPATH': pythonpath,
   924         srcdir = os.path.join(tmpdir, os.listdir(tmpdir)[0])
   957                 'PIP_FIND_LINKS': findlinks,
   925         cmd = [py_executable, 'setup.py', 'install',
   958                 'PIP_USE_WHEEL': '1',
   926             '--single-version-externally-managed',
   959                 'PIP_PRE': '1',
   927             '--record', 'record']
   960                 'PIP_NO_INDEX': '1'
   928         logger.start_progress('Installing %s...' % project_name)
   961             }
   929         logger.indent += 2
   962         )
   930         try:
       
   931             call_subprocess(cmd, show_stdout=False, cwd=srcdir,
       
   932                     filter_stdout=filter_install_output)
       
   933         finally:
       
   934             logger.indent -= 2
       
   935             logger.end_progress()
       
   936     finally:
   963     finally:
   937         shutil.rmtree(tmpdir)
   964         logger.indent -= 2
       
   965         logger.end_progress()
   938 
   966 
   939 def create_environment(home_dir, site_packages=False, clear=False,
   967 def create_environment(home_dir, site_packages=False, clear=False,
   940                        unzip_setuptools=False,
   968                        unzip_setuptools=False,
   941                        prompt=None, search_dirs=None, never_download=False,
   969                        prompt=None, search_dirs=None, never_download=False,
   942                        no_setuptools=False, no_pip=False, symlink=True):
   970                        no_setuptools=False, no_pip=False, symlink=True):
   956         site_packages=site_packages, clear=clear, symlink=symlink))
   984         site_packages=site_packages, clear=clear, symlink=symlink))
   957 
   985 
   958     install_distutils(home_dir)
   986     install_distutils(home_dir)
   959 
   987 
   960     if not no_setuptools:
   988     if not no_setuptools:
   961         install_sdist('Setuptools', 'setuptools-*.tar.gz', py_executable, search_dirs)
   989         to_install = ['setuptools']
   962         if not no_pip:
   990         if not no_pip:
   963             install_sdist('Pip', 'pip-*.tar.gz', py_executable, search_dirs)
   991             to_install.append('pip')
       
   992         install_wheel(to_install, py_executable, search_dirs)
   964 
   993 
   965     install_activate(home_dir, bin_dir, prompt)
   994     install_activate(home_dir, bin_dir, prompt)
   966 
   995 
   967 def is_executable_file(fpath):
   996 def is_executable_file(fpath):
   968     return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
   997     return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
  1219     py_executable = join(bin_dir, os.path.basename(sys.executable))
  1248     py_executable = join(bin_dir, os.path.basename(sys.executable))
  1220     if 'Python.framework' in prefix:
  1249     if 'Python.framework' in prefix:
  1221         # OS X framework builds cause validation to break
  1250         # OS X framework builds cause validation to break
  1222         # https://github.com/pypa/virtualenv/issues/322
  1251         # https://github.com/pypa/virtualenv/issues/322
  1223         if os.environ.get('__PYVENV_LAUNCHER__'):
  1252         if os.environ.get('__PYVENV_LAUNCHER__'):
  1224           os.unsetenv('__PYVENV_LAUNCHER__')
  1253             del os.environ["__PYVENV_LAUNCHER__"]
  1225         if re.search(r'/Python(?:-32|-64)*$', py_executable):
  1254         if re.search(r'/Python(?:-32|-64)*$', py_executable):
  1226             # The name of the python executable is not quite what
  1255             # The name of the python executable is not quite what
  1227             # we want, rename it.
  1256             # we want, rename it.
  1228             py_executable = os.path.join(
  1257             py_executable = os.path.join(
  1229                     os.path.dirname(py_executable), 'python')
  1258                     os.path.dirname(py_executable), 'python')
  1372             if os.path.exists(full_pth):
  1401             if os.path.exists(full_pth):
  1373                 os.unlink(full_pth)
  1402                 os.unlink(full_pth)
  1374             if symlink:
  1403             if symlink:
  1375                 os.symlink(py_executable_base, full_pth)
  1404                 os.symlink(py_executable_base, full_pth)
  1376             else:
  1405             else:
  1377                 shutil.copyfile(py_executable_base, full_pth)
  1406                 copyfile(py_executable, full_pth, symlink)
  1378 
  1407 
  1379     if is_win and ' ' in py_executable:
  1408     if is_win and ' ' in py_executable:
  1380         # There's a bug with subprocess on Windows when using a first
  1409         # There's a bug with subprocess on Windows when using a first
  1381         # argument that has a space in it.  Instead we have to quote
  1410         # argument that has a space in it.  Instead we have to quote
  1382         # the value:
  1411         # the value:
  1503             if not os.path.exists(local_path):
  1532             if not os.path.exists(local_path):
  1504                 os.mkdir(local_path)
  1533                 os.mkdir(local_path)
  1505                 for subdir_name in os.listdir(home_dir):
  1534                 for subdir_name in os.listdir(home_dir):
  1506                     if subdir_name == 'local':
  1535                     if subdir_name == 'local':
  1507                         continue
  1536                         continue
  1508                     cp_or_ln = (os.symlink if symlink else copyfile)
  1537                     copyfile(os.path.abspath(os.path.join(home_dir, subdir_name)), \
  1509                     cp_or_ln(os.path.abspath(os.path.join(home_dir, subdir_name)), \
  1538                                                             os.path.join(local_path, subdir_name), symlink)
  1510                                                             os.path.join(local_path, subdir_name))
       
  1511 
  1539 
  1512 def fix_lib64(lib_dir, symlink=True):
  1540 def fix_lib64(lib_dir, symlink=True):
  1513     """
  1541     """
  1514     Some platforms (particularly Gentoo on x64) put things in lib64/pythonX.Y
  1542     Some platforms (particularly Gentoo on x64) put things in lib64/pythonX.Y
  1515     instead of lib/pythonX.Y.  If this is such a platform we'll just create a
  1543     instead of lib/pythonX.Y.  If this is such a platform we'll just create a
  1583     fixup_scripts(home_dir, bin_dir)
  1611     fixup_scripts(home_dir, bin_dir)
  1584     fixup_pth_and_egg_link(home_dir)
  1612     fixup_pth_and_egg_link(home_dir)
  1585     ## FIXME: need to fix up distutils.cfg
  1613     ## FIXME: need to fix up distutils.cfg
  1586 
  1614 
  1587 OK_ABS_SCRIPTS = ['python', 'python%s' % sys.version[:3],
  1615 OK_ABS_SCRIPTS = ['python', 'python%s' % sys.version[:3],
  1588                   'activate', 'activate.bat', 'activate_this.py']
  1616                   'activate', 'activate.bat', 'activate_this.py',
       
  1617                   'activate.fish', 'activate.csh']
  1589 
  1618 
  1590 def fixup_scripts(home_dir, bin_dir):
  1619 def fixup_scripts(home_dir, bin_dir):
  1591     if is_win:
  1620     if is_win:
  1592         new_shebang_args = (
  1621         new_shebang_args = (
  1593             '%s /c' % os.path.normcase(os.environ.get('COMSPEC', 'cmd.exe')),
  1622             '%s /c' % os.path.normcase(os.environ.get('COMSPEC', 'cmd.exe')),
  1906 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
  1958 abV46zZtMMiZnWgPwBqF4P8ACHXrHw==
  1987 Qc7sRHsA1igE/wfVIOdx
  1959 """)
  1988 """)
  1960 
  1989 
  1961 ##file activate.sh
  1990 ##file activate.sh
  1962 ACTIVATE_SH = convert("""
  1991 ACTIVATE_SH = convert("""
  1963 eJytVVFvokAQfudXTLEPtTlLeo9tvMSmJpq02hSvl7u2wRUG2QR2DSxSe7n/frOACEVNLlceRHa+
  1992 eJytVVFvokAQfudXTLEPtTlLeo9tvMSmJpq02hSvl7u2wRUG2QR2DSxSe7n/frOACEVNLlceRHa+
  1977 +n8O9H8f5vsGOWXsL1+1k3g=
  2006 +n8O9H8f5vsGOWXsL1+1k3g=
  1978 """)
  2007 """)
  1979 
  2008 
  1980 ##file activate.fish
  2009 ##file activate.fish
  1981 ACTIVATE_FISH = convert("""
  2010 ACTIVATE_FISH = convert("""
  1982 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
       
  2026 32XS1ITj/qLjN72ob0hc5C9bzw8MhfmL
  1997 """)
  2027 """)
  1998 
  2028 
  1999 ##file activate.csh
  2029 ##file activate.csh
  2000 ACTIVATE_CSH = convert("""
  2030 ACTIVATE_CSH = convert("""
  2001 eJx9VG1P2zAQ/u5fcYQKNgTNPtN1WxlIQ4KCUEGaxuQ6yYVYSuzKdhqVX7+zk3bpy5YPUXL3PPfc
  2031 eJx9VG1P2zAQ/u5fcYQKNgTNPtN1WxlIQ4KCUEGaxuQ6yYVYSuzKdhqVX7+zk3bpy5YPUXL3PPfc