Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def run_pip(package: str, venv_dir: Path, pip_args: List[str], verbose: bool):
venv = Venv(venv_dir, verbose=verbose)
if not venv.python_path.exists():
raise PipxError(
f"venv for {package!r} was not found. Was {package!r} installed with pipx?"
)
venv.verbose = True
venv._run_pip(pip_args)
venv = Venv(venv_dir, python=python, verbose=verbose)
try:
venv.create_venv(venv_args, pip_args)
try:
venv.install_package(
package=package,
package_or_url=package_or_url,
pip_args=pip_args,
include_dependencies=include_dependencies,
include_apps=True,
is_main_package=True,
)
except PackageInstallFailureError:
venv.remove_venv()
raise PipxError(
f"Could not install package {package}. Is the name or spec correct?"
)
_run_post_install_actions(
venv, package, local_bin_dir, venv_dir, include_dependencies, force=force
)
except (Exception, KeyboardInterrupt):
print("")
venv.remove_venv()
raise
before injecting into it."""
)
)
venv = Venv(venv_dir, verbose=verbose)
try:
venv.install_package(
package=package,
package_or_url=package_or_url,
pip_args=pip_args,
include_dependencies=include_dependencies,
include_apps=include_apps,
is_main_package=False,
)
except PackageInstallFailureError:
raise PipxError(
f"Could not inject package {package}. Is the name or spec correct?"
)
if include_apps:
_run_post_install_actions(
venv,
package,
constants.LOCAL_BIN_DIR,
venv_dir,
include_dependencies,
force=force,
)
print(f" injected package {bold(package)} into venv {bold(venv_dir.name)}")
print(f"done! {stars}", file=sys.stderr)
raise PipxError(
f"No apps associated with package {package}. "
"If you are attempting to install a library, pipx should not be used. "
"Consider using pip or a similar tool instead."
)
if package_metadata.apps:
pass
elif package_metadata.apps_of_dependencies and include_dependencies:
pass
else:
# No apps associated with this package and we aren't including dependencies.
# This package has nothing for pipx to use, so this is an error.
if venv.safe_to_remove():
venv.remove_venv()
raise PipxError(
f"No apps associated with package {package} or its dependencies."
"If you are attempting to install a library, pipx should not be used. "
"Consider using pip or a similar tool instead."
)
expose_apps_globally(
local_bin_dir, package_metadata.app_paths, package, force=force
)
if include_dependencies:
for _, app_paths in package_metadata.app_paths_of_dependencies.items():
expose_apps_globally(local_bin_dir, app_paths, package, force=force)
print(get_package_summary(venv_dir, package=package, new_install=True))
_warn_if_not_on_path(local_bin_dir)
print(f"done! {stars}", file=sys.stderr)
venv.pipx_metadata.main_package.pip_args,
venv.pipx_metadata.venv_args,
verbose,
force=True,
include_dependencies=venv.pipx_metadata.main_package.include_dependencies,
)
# now install injected packages
for (
injected_name,
injected_package,
) in venv.pipx_metadata.injected_packages.items():
if injected_package.package_or_url is None:
# This should never happen, but package_or_url is type
# Optional[str] so mypy thinks it could be None
raise PipxError("Internal Error injecting package")
inject(
venv_dir,
injected_name,
injected_package.package_or_url,
injected_package.pip_args,
verbose=verbose,
include_apps=injected_package.include_apps,
include_dependencies=injected_package.include_dependencies,
force=True,
)
def inject(
venv_dir: Path,
package: str,
package_or_url: str,
pip_args: List[str],
*,
verbose: bool,
include_apps: bool,
include_dependencies: bool,
force: bool,
):
if not venv_dir.exists() or not next(venv_dir.iterdir()):
raise PipxError(
textwrap.dedent(
f"""\
Can't inject {package!r} into nonexistent Virtual Environment {str(venv_dir)!r}.
Be sure to install the package first with pipx install {venv_dir.name!r}
before injecting into it."""
)
)
venv = Venv(venv_dir, verbose=verbose)
try:
venv.install_package(
package=package,
package_or_url=package_or_url,
pip_args=pip_args,
include_dependencies=include_dependencies,
include_apps=include_apps,
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 "
for app in dependent_apps:
print(f" - {app.name}")
if venv.safe_to_remove():
venv.remove_venv()
if len(package_metadata.app_paths_of_dependencies.keys()):
raise PipxError(
f"No apps associated with package {package}. "
"Try again with '--include-deps' to include apps of dependent packages, "
"which are listed above. "
"If you are attempting to install a library, pipx should not be used. "
"Consider using pip or a similar tool instead."
)
else:
raise PipxError(
f"No apps associated with package {package}. "
"If you are attempting to install a library, pipx should not be used. "
"Consider using pip or a similar tool instead."
)
if package_metadata.apps:
pass
elif package_metadata.apps_of_dependencies and include_dependencies:
pass
else:
# No apps associated with this package and we aren't including dependencies.
# This package has nothing for pipx to use, so this is an error.
if venv.safe_to_remove():
venv.remove_venv()
raise PipxError(
f"No apps associated with package {package} or its dependencies."
def upgrade(
venv_dir: Path,
package: str,
pip_args: List[str],
verbose: bool,
*,
upgrading_all: bool,
force: bool,
) -> int:
"""Returns nonzero if package was upgraded, 0 if version did not change"""
if not venv_dir.is_dir():
raise PipxError(
f"Package is not installed. Expected to find {str(venv_dir)}, "
"but it does not exist."
)
venv = Venv(venv_dir, verbose=verbose)
package_metadata = venv.package_metadata[package]
if package_metadata.package_or_url is not None:
package_or_url = package_metadata.package_or_url
old_version = package_metadata.package_version
include_apps = package_metadata.include_apps
include_dependencies = package_metadata.include_dependencies
else:
# fallback if no metadata
package_or_url = package
old_version = ""