def iter_venvs(project: Project) -> Iterable[Tuple[str, Path]]: """Return an iterable of venv paths associated with the project""" in_project_venv_python = get_in_project_venv_python(project.root) if in_project_venv_python is not None: yield "in-project", Path(in_project_venv_python).parent.parent venv_prefix = get_venv_prefix(project) venv_parent = Path(project.config["venv.location"]) for venv in venv_parent.glob(f"{venv_prefix}*"): ident = venv.name[len(venv_prefix):] yield ident, venv
def find_interpreters(self, python_spec: str | None = None ) -> Iterable[PythonInfo]: """Return an iterable of interpreter paths that matches the given specifier, which can be: 1. a version specifier like 3.7 2. an absolute path 3. a short name like python3 4. None that returns all possible interpreters """ config = self.config python: str | Path | None = None if not python_spec: if config.get("python.use_pyenv", True) and PYENV_INSTALLED: pyenv_shim = os.path.join(PYENV_ROOT, "shims", "python3") if os.path.exists(pyenv_shim): yield PythonInfo.from_path(pyenv_shim) elif os.path.exists(pyenv_shim[:-1]): yield PythonInfo.from_path(pyenv_shim[:-1]) if config.get("use_venv"): python = get_in_project_venv_python(self.root) if python: yield PythonInfo.from_path(python) python = shutil.which("python") if python: yield PythonInfo.from_path(python) args = [] else: if not all(c.isdigit() for c in python_spec.split(".")): if Path(python_spec).exists(): python = find_python_in_path(python_spec) if python: yield PythonInfo.from_path(python) else: python = shutil.which(python_spec) if python: yield PythonInfo.from_path(python) return args = [int(v) for v in python_spec.split(".") if v != ""] finder = Finder() for entry in finder.find_all_python_versions(*args): yield PythonInfo.from_python_version(entry.py_version) if not python_spec: this_python = getattr(sys, "_base_executable", sys.executable) yield PythonInfo.from_path(this_python)