def run_app(self, app: str, filename: str, app_args: List[str]) -> NoReturn: entry_point = self._find_entry_point(app) # No [pipx.run] entry point; default to run console script. if entry_point is None: exec_app([str(self.bin_path / filename)] + app_args) # Evaluate and execute the entry point. # TODO: After dropping support for Python < 3.9, use # "entry_point.module" and "entry_point.attr" instead. match = _entry_point_value_pattern.match(entry_point.value) assert match is not None, "invalid entry point" module, attr = match.group("module", "attr") code = (f"import sys, {module}\n" f"sys.argv[0] = {entry_point.name!r}\n" f"sys.exit({module}.{attr}())\n") exec_app([str(self.python_path), "-c", code] + app_args)
def run_app(self, app: str, filename: str, app_args: List[str]) -> NoReturn: exec_app([str(self.bin_path / filename)] + app_args)
def run( app: str, package_or_url: str, app_args: List[str], python: str, pip_args: List[str], venv_args: List[str], pypackages: bool, verbose: bool, use_cache: bool, ) -> NoReturn: """Installs venv to temporary dir (or reuses cache), then runs app from package """ if urllib.parse.urlparse(app).scheme: if not app.endswith(".py"): raise PipxError(""" pipx will only execute apps from the internet directly if they end with '.py'. To run from an SVN, try pipx --spec URL BINARY """) logger.info( "Detected url. Downloading and executing as a Python file.") content = _http_get_request(app) exec_app([str(python), "-c", content]) elif which(app): logger.warning( pipx_wrap( f""" {hazard} {app} is already on your PATH and installed at {which(app)}. Downloading and running anyway. """, subsequent_indent=" " * 4, )) if WINDOWS: app_filename = f"{app}.exe" logger.info(f"Assuming app is {app_filename!r} (Windows only)") else: app_filename = app pypackage_bin_path = get_pypackage_bin_path(app) if pypackage_bin_path.exists(): logger.info( f"Using app in local __pypackages__ directory at {str(pypackage_bin_path)}" ) run_pypackage_bin(pypackage_bin_path, app_args) if pypackages: raise PipxError(f""" '--pypackages' flag was passed, but {str(pypackage_bin_path)!r} was not found. See https://github.com/cs01/pythonloc to learn how to install here, or omit the flag. """) venv_dir = _get_temporary_venv_path(package_or_url, python, pip_args, venv_args) venv = Venv(venv_dir) bin_path = venv.bin_path / app_filename _prepare_venv_cache(venv, bin_path, use_cache) if venv.has_app(app, app_filename): logger.info(f"Reusing cached venv {venv_dir}") venv.run_app(app, app_filename, app_args) else: logger.info(f"venv location is {venv_dir}") _download_and_run( Path(venv_dir), package_or_url, app, app_filename, app_args, python, pip_args, venv_args, use_cache, verbose, )
def run_app(self, app: str, app_args: List[str]) -> None: exec_app([str(self.bin_path / app)] + app_args)