comparison venv/lib/python2.7/site-packages/pip/locations.py @ 0:d67268158946 draft

planemo upload commit a3f181f5f126803c654b3a66dd4e83a48f7e203b
author bcclaywell
date Mon, 12 Oct 2015 17:43:33 -0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:d67268158946
1 """Locations where we look for configs, install stuff, etc"""
2 from __future__ import absolute_import
3
4 import getpass
5 import os
6 import os.path
7 import site
8 import sys
9 import tempfile
10
11 from distutils import sysconfig
12 from distutils.command.install import install, SCHEME_KEYS
13
14 from pip.compat import get_path_uid, WINDOWS
15 from pip.utils import appdirs
16 from pip import exceptions
17
18
19 # Hack for flake8
20 install
21
22
23 # CA Bundle Locations
24 CA_BUNDLE_PATHS = [
25 # Debian/Ubuntu/Gentoo etc.
26 "/etc/ssl/certs/ca-certificates.crt",
27
28 # Fedora/RHEL
29 "/etc/pki/tls/certs/ca-bundle.crt",
30
31 # OpenSUSE
32 "/etc/ssl/ca-bundle.pem",
33
34 # OpenBSD
35 "/etc/ssl/cert.pem",
36
37 # FreeBSD/DragonFly
38 "/usr/local/share/certs/ca-root-nss.crt",
39
40 # Homebrew on OSX
41 "/usr/local/etc/openssl/cert.pem",
42 ]
43
44 # Attempt to locate a CA Bundle that we can pass into requests, we have a list
45 # of possible ones from various systems. If we cannot find one then we'll set
46 # this to None so that we default to whatever requests is setup to handle.
47 #
48 # Note to Downstream: If you wish to disable this autodetection and simply use
49 # whatever requests does (likely you've already patched
50 # requests.certs.where()) then simply edit this line so
51 # that it reads ``CA_BUNDLE_PATH = None``.
52 CA_BUNDLE_PATH = next((x for x in CA_BUNDLE_PATHS if os.path.exists(x)), None)
53
54
55 # Application Directories
56 USER_CACHE_DIR = appdirs.user_cache_dir("pip")
57
58
59 DELETE_MARKER_MESSAGE = '''\
60 This file is placed here by pip to indicate the source was put
61 here by pip.
62
63 Once this package is successfully installed this source code will be
64 deleted (unless you remove this file).
65 '''
66 PIP_DELETE_MARKER_FILENAME = 'pip-delete-this-directory.txt'
67
68
69 def write_delete_marker_file(directory):
70 """
71 Write the pip delete marker file into this directory.
72 """
73 filepath = os.path.join(directory, PIP_DELETE_MARKER_FILENAME)
74 with open(filepath, 'w') as marker_fp:
75 marker_fp.write(DELETE_MARKER_MESSAGE)
76
77
78 def running_under_virtualenv():
79 """
80 Return True if we're running inside a virtualenv, False otherwise.
81
82 """
83 if hasattr(sys, 'real_prefix'):
84 return True
85 elif sys.prefix != getattr(sys, "base_prefix", sys.prefix):
86 return True
87
88 return False
89
90
91 def virtualenv_no_global():
92 """
93 Return True if in a venv and no system site packages.
94 """
95 # this mirrors the logic in virtualenv.py for locating the
96 # no-global-site-packages.txt file
97 site_mod_dir = os.path.dirname(os.path.abspath(site.__file__))
98 no_global_file = os.path.join(site_mod_dir, 'no-global-site-packages.txt')
99 if running_under_virtualenv() and os.path.isfile(no_global_file):
100 return True
101
102
103 def __get_username():
104 """ Returns the effective username of the current process. """
105 if WINDOWS:
106 return getpass.getuser()
107 import pwd
108 return pwd.getpwuid(os.geteuid()).pw_name
109
110
111 def _get_build_prefix():
112 """ Returns a safe build_prefix """
113 path = os.path.join(
114 tempfile.gettempdir(),
115 'pip_build_%s' % __get_username().replace(' ', '_')
116 )
117 if WINDOWS:
118 """ on windows(tested on 7) temp dirs are isolated """
119 return path
120 try:
121 os.mkdir(path)
122 write_delete_marker_file(path)
123 except OSError:
124 file_uid = None
125 try:
126 # raises OSError for symlinks
127 # https://github.com/pypa/pip/pull/935#discussion_r5307003
128 file_uid = get_path_uid(path)
129 except OSError:
130 file_uid = None
131
132 if file_uid != os.geteuid():
133 msg = (
134 "The temporary folder for building (%s) is either not owned by"
135 " you, or is a symlink." % path
136 )
137 print(msg)
138 print(
139 "pip will not work until the temporary folder is either "
140 "deleted or is a real directory owned by your user account."
141 )
142 raise exceptions.InstallationError(msg)
143 return path
144
145 if running_under_virtualenv():
146 build_prefix = os.path.join(sys.prefix, 'build')
147 src_prefix = os.path.join(sys.prefix, 'src')
148 else:
149 # Note: intentionally NOT using mkdtemp
150 # See https://github.com/pypa/pip/issues/906 for plan to move to mkdtemp
151 build_prefix = _get_build_prefix()
152
153 # FIXME: keep src in cwd for now (it is not a temporary folder)
154 try:
155 src_prefix = os.path.join(os.getcwd(), 'src')
156 except OSError:
157 # In case the current working directory has been renamed or deleted
158 sys.exit(
159 "The folder you are executing pip from can no longer be found."
160 )
161
162 # under Mac OS X + virtualenv sys.prefix is not properly resolved
163 # it is something like /path/to/python/bin/..
164 # Note: using realpath due to tmp dirs on OSX being symlinks
165 build_prefix = os.path.abspath(os.path.realpath(build_prefix))
166 src_prefix = os.path.abspath(src_prefix)
167
168 # FIXME doesn't account for venv linked to global site-packages
169
170 site_packages = sysconfig.get_python_lib()
171 user_site = site.USER_SITE
172 user_dir = os.path.expanduser('~')
173 if WINDOWS:
174 bin_py = os.path.join(sys.prefix, 'Scripts')
175 bin_user = os.path.join(user_site, 'Scripts')
176 # buildout uses 'bin' on Windows too?
177 if not os.path.exists(bin_py):
178 bin_py = os.path.join(sys.prefix, 'bin')
179 bin_user = os.path.join(user_site, 'bin')
180
181 config_basename = 'pip.ini'
182
183 legacy_storage_dir = os.path.join(user_dir, 'pip')
184 legacy_config_file = os.path.join(
185 legacy_storage_dir,
186 config_basename,
187 )
188 else:
189 bin_py = os.path.join(sys.prefix, 'bin')
190 bin_user = os.path.join(user_site, 'bin')
191
192 config_basename = 'pip.conf'
193
194 legacy_storage_dir = os.path.join(user_dir, '.pip')
195 legacy_config_file = os.path.join(
196 legacy_storage_dir,
197 config_basename,
198 )
199
200 # Forcing to use /usr/local/bin for standard Mac OS X framework installs
201 # Also log to ~/Library/Logs/ for use with the Console.app log viewer
202 if sys.platform[:6] == 'darwin' and sys.prefix[:16] == '/System/Library/':
203 bin_py = '/usr/local/bin'
204
205 site_config_files = [
206 os.path.join(path, config_basename)
207 for path in appdirs.site_config_dirs('pip')
208 ]
209
210
211 def distutils_scheme(dist_name, user=False, home=None, root=None,
212 isolated=False):
213 """
214 Return a distutils install scheme
215 """
216 from distutils.dist import Distribution
217
218 scheme = {}
219
220 if isolated:
221 extra_dist_args = {"script_args": ["--no-user-cfg"]}
222 else:
223 extra_dist_args = {}
224 dist_args = {'name': dist_name}
225 dist_args.update(extra_dist_args)
226
227 d = Distribution(dist_args)
228 d.parse_config_files()
229 i = d.get_command_obj('install', create=True)
230 # NOTE: setting user or home has the side-effect of creating the home dir
231 # or user base for installations during finalize_options()
232 # ideally, we'd prefer a scheme class that has no side-effects.
233 i.user = user or i.user
234 i.home = home or i.home
235 i.root = root or i.root
236 i.finalize_options()
237 for key in SCHEME_KEYS:
238 scheme[key] = getattr(i, 'install_' + key)
239
240 if i.install_lib is not None:
241 # install_lib takes precedence over purelib and platlib
242 scheme.update(dict(purelib=i.install_lib, platlib=i.install_lib))
243
244 if running_under_virtualenv():
245 scheme['headers'] = os.path.join(
246 sys.prefix,
247 'include',
248 'site',
249 'python' + sys.version[:3],
250 dist_name,
251 )
252
253 if root is not None:
254 scheme["headers"] = os.path.join(
255 root,
256 os.path.abspath(scheme["headers"])[1:],
257 )
258
259 return scheme