Example #1
0
File: venv.py Project: ionelmc/pipx
    def __init__(self,
                 path: Path,
                 *,
                 verbose: bool = False,
                 python: str = DEFAULT_PYTHON) -> None:
        self.root = path
        self.python = python
        self.bin_path, self.python_path = get_venv_paths(self.root)
        self.pipx_metadata = PipxMetadata(venv_dir=path)
        self.verbose = verbose
        self.do_animation = not verbose
        try:
            self._existing = self.root.exists() and next(self.root.iterdir())
        except StopIteration:
            self._existing = False

        if self._existing and self.uses_shared_libs:
            if shared_libs.is_valid:
                if shared_libs.needs_upgrade:
                    shared_libs.upgrade(verbose=verbose)
            else:
                shared_libs.create(verbose)

            if not shared_libs.is_valid:
                raise PipxError(
                    pipx_wrap(f"""
                        Error: pipx's shared venv {shared_libs.root} is invalid
                        and needs re-installation. To fix this, install or
                        reinstall a package. For example:
                        """) + f"\n  pipx install {self.root.name} --force",
                    wrap_message=False,
                )
Example #2
0
    def __init__(self,
                 path: Path,
                 *,
                 verbose: bool = False,
                 python: str = DEFAULT_PYTHON) -> None:
        self.root = path
        self._python = python
        self.bin_path, self.python_path = get_venv_paths(self.root)
        self.pipx_metadata = PipxMetadata(venv_dir=path)
        self.verbose = verbose
        self.do_animation = not verbose
        try:
            self._existing = self.root.exists() and next(self.root.iterdir())
        except StopIteration:
            self._existing = False

        if self._existing and self.uses_shared_libs and not shared_libs.is_valid:
            logging.warning(
                f"Shared libraries not found, but are required for package {self.root.name}. "
                "Attempting to install now.")
            shared_libs.create([])
            if shared_libs.is_valid:
                logging.info("Successfully created shared libraries")
            else:
                raise PipxError(
                    f"Error: pipx's shared venv is invalid and "
                    "needs re-installation. To fix this, install or reinstall a "
                    "package. For example,\n"
                    f"  pipx install {self.root.name} --force")
Example #3
0
 def create_venv(self, venv_args: List[str], pip_args: List[str]) -> None:
     with animate("creating virtual environment", self.do_animation):
         cmd = [self._python, "-m", "venv", "--without-pip"]
         run(cmd + venv_args + [str(self.root)])
     shared_libs.create(pip_args, self.verbose)
     pipx_pth = get_site_packages(self.python_path) / PIPX_SHARED_PTH
     # write path pointing to the shared libs site-packages directory
     # example pipx_pth location:
     #   ~/.local/pipx/venvs/black/lib/python3.8/site-packages/pipx_shared.pth
     # example shared_libs.site_packages location:
     #   ~/.local/pipx/shared/lib/python3.6/site-packages
     #
     # https://docs.python.org/3/library/site.html
     # A path configuration file is a file whose name has the form 'name.pth'.
     # its contents are additional items (one per line) to be added to sys.path
     pipx_pth.write_text(str(shared_libs.site_packages) + "\n", encoding="utf-8")