def _activate(self): if not self._working_set: working_set = WorkingSet([]) # set up the local .pex environment pex_info = self._pex_info.copy() pex_info.update(self._pex_info_overrides) pex_info.merge_pex_path(self._vars.PEX_PATH) self._envs.append( PEXEnvironment(self._pex, pex_info, interpreter=self._interpreter)) # N.B. by this point, `pex_info.pex_path` will contain a single pex path # merged from pex_path in `PEX-INFO` and `PEX_PATH` set in the environment. # `PEX_PATH` entries written into `PEX-INFO` take precedence over those set # in the environment. if pex_info.pex_path: # set up other environments as specified in pex_path for pex_path in filter(None, pex_info.pex_path.split(os.pathsep)): pex_info = PexInfo.from_pex(pex_path) pex_info.update(self._pex_info_overrides) self._envs.append( PEXEnvironment(pex_path, pex_info, interpreter=self._interpreter)) # activate all of them for env in self._envs: for dist in env.activate(): working_set.add(dist) self._working_set = working_set return self._working_set
def _activate(self): # type: () -> WorkingSet working_set = WorkingSet([]) # set up the local .pex environment pex_info = self.pex_info() self._envs.append(PEXEnvironment(self._pex, pex_info, interpreter=self._interpreter)) # N.B. by this point, `pex_info.pex_path` will contain a single pex path # merged from pex_path in `PEX-INFO` and `PEX_PATH` set in the environment. # `PEX_PATH` entries written into `PEX-INFO` take precedence over those set # in the environment. if pex_info.pex_path: # set up other environments as specified in pex_path for pex_path in filter(None, pex_info.pex_path.split(os.pathsep)): pex_info = PexInfo.from_pex(pex_path) pex_info.update(self._pex_info_overrides) self._envs.append(PEXEnvironment(pex_path, pex_info, interpreter=self._interpreter)) # activate all of them for env in self._envs: for dist in env.activate(): working_set.add(dist) # Ensure that pkg_resources is not imported until at least every pex environment # (i.e. PEX_PATH) has been merged into the environment PEXEnvironment.declare_namespace_packages(working_set) self.patch_pkg_resources(working_set) return working_set
def _activate(self): # type: () -> WorkingSet pex_file = os.path.realpath(self._pex) self._update_candidate_distributions( self._load_internal_cache(pex_file, self._pex_info)) is_zipped_pex = os.path.isfile(pex_file) if not self._pex_info.zip_safe and is_zipped_pex: explode_dir = self._force_local(pex_file=pex_file, pex_info=self._pex_info) # Force subsequent imports to come from the exploded .pex directory rather than the .pex file. TRACER.log( "Adding exploded non zip-safe pex to the head of sys.path: %s" % explode_dir) sys.path[:] = [ path for path in sys.path if pex_file != os.path.realpath(path) ] sys.path.insert(0, explode_dir) self._update_module_paths(pex_file=pex_file) elif not any(pex_file == os.path.realpath(path) for path in sys.path): TRACER.log("Adding pex %s to the head of sys.path: %s" % ("file" if is_zipped_pex else "dir", pex_file)) sys.path.insert(0, pex_file) all_reqs = [ Requirement.parse(req) for req in self._pex_info.requirements ] working_set = WorkingSet([]) resolved = self._resolve(working_set, all_reqs) for dist in resolved: with TRACER.timed("Activating %s" % dist, V=2): working_set.add(dist) if self._inherit_path == InheritPath.FALLBACK: # Prepend location to sys.path. # # This ensures that bundled versions of libraries will be used before system-installed # versions, in case something is installed in both, helping to favor hermeticity in # the case of non-hermetic PEX files (i.e. those with inherit_path=True). # # If the path is not already in sys.path, site.addsitedir will append (not prepend) # the path to sys.path. But if the path is already in sys.path, site.addsitedir will # leave sys.path unmodified, but will do everything else it would do. This is not part # of its advertised contract (which is very vague), but has been verified to be the # case by inspecting its source for both cpython 2.7 and cpython 3.7. sys.path.insert(0, dist.location) else: sys.path.append(dist.location) with TRACER.timed("Adding sitedir", V=2): site.addsitedir(dist.location) return working_set
def _activate(self): self.update_candidate_distributions( self.load_internal_cache(self._pex, self._pex_info)) if not self._pex_info.zip_safe and os.path.isfile(self._pex): explode_dir = self.force_local(pex_file=self._pex, pex_info=self._pex_info) self.update_module_paths(pex_file=self._pex, explode_dir=explode_dir) all_reqs = [ Requirement.parse(req) for req in self._pex_info.requirements ] working_set = WorkingSet([]) resolved = self._resolve(working_set, all_reqs) for dist in resolved: with TRACER.timed('Activating %s' % dist, V=2): working_set.add(dist) if self._inherit_path == "fallback": # Prepend location to sys.path. # # This ensures that bundled versions of libraries will be used before system-installed # versions, in case something is installed in both, helping to favor hermeticity in # the case of non-hermetic PEX files (i.e. those with inherit_path=True). # # If the path is not already in sys.path, site.addsitedir will append (not prepend) # the path to sys.path. But if the path is already in sys.path, site.addsitedir will # leave sys.path unmodified, but will do everything else it would do. This is not part # of its advertised contract (which is very vague), but has been verified to be the # case by inspecting its source for both cpython 2.7 and cpython 3.7. sys.path.insert(0, dist.location) else: sys.path.append(dist.location) with TRACER.timed('Adding sitedir', V=2): site.addsitedir(dist.location) # Delay calling 'self._declare_namespace_packages' until 'sys.path' contains all of the # resolved dists. for dist in resolved: self._declare_namespace_packages(dist) return working_set