microsoft / microsoft/vscode-python-environments

"Failed to create conda environment" after the env is actually created — conda info --envs --json no longer returns envs_dirs (conda 26.x)

Ouverte
#1,766 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

triage-needed
Langage dominant
TypeScript
Étoiles
138
Forks
62
Merge moyen
1 j 4 h
PR mergées (30 j)
35

Description

Environment

Extension ms-python.vscode-python-envs 1.36.0
VS Code 1.136.1 (Windows 11, 10.0.26200)
conda 26.7.2 (miniforge3)

Steps to reproduce

  1. Python: Create EnvironmentCondaNamed (with an English display language).
  2. Pick a Python version, enter a name (test).

Actual

conda itself succeeds — the output channel shows the whole transaction completing:

Preparing transaction: ...working... done
Verifying transaction: ...working... done
Executing transaction: ...working... done
#
# To activate this environment, use
#
#     $ conda activate test

and then the extension fails:

[info]    Using conda from cache: C:\Users\...\miniforge3\Library\bin\conda.BAT
[info]    Ran conda in 697: C:\Users\...\miniforge3\Library\bin\conda.BAT info --envs --json
[warning] conda info envs_dirs is undefined/null
[error]   Failed to create conda environment A system error occurred
          (ENOENT: no such file or directory, scandir
           'C:\Users\...\AppData\Local\Programs\Microsoft VS Code\conda-meta')

The environment is created and fully usable. Only the post-creation prefix lookup fails — but the user is shown Failed to create conda environment, which reads as though nothing was created.

Cause

The env-dirs helper calls conda info --envs --json and reads envs_dirs from it:

const e = await H(["info", "--envs", "--json"]);
const t = JSON.parse(e);
const n = t.envs_dirs;
return null == n
    ? (traceWarn("conda info envs_dirs is undefined/null"), { envs_dirs: [] })
    : Array.isArray(n)
    ? { envs_dirs: n }
    : { envs_dirs: [] };

As of conda 26.x, conda info --envs --json returns only envs and envs_details. envs_dirs is present only in the unfiltered conda info --json:

$ conda info --envs --json
{
  "envs": [
    "C:\\Users\\...\\miniforge3",
    "C:\\Users\\...\\miniforge3\\envs\\test",
    ...
  ],
  "envs_details": { ... }
}
# no envs_dirs key

$ conda info --json | findstr envs_dirs
  "envs_dirs": [ ... ]

So envs_dirs becomes []. The empty list makes the subsequent prefix search join an empty base path, and conda-meta ends up resolved relative to the process cwd — VS Code's own install directory — which is the ENOENT above.

Aggravating factor

The empty result is cached, and the cache-hit check accepts an empty array:

const n = await e.get(CONDA_PREFIXES_KEY);
if (n && Array.isArray(n)) return j = n, j;   // [] passes this check
...
j = n.envs_dirs;                              // []
await e.set(CONDA_PREFIXES_KEY, ...);         // and gets cached

Once it has failed, the bad [] is served from cache on later attempts, so the failure persists until the cache is cleared.

Suggested fix

  • Read envs_dirs from conda info --json (or conda config --show envs_dirs --json) instead of conda info --envs --json.
  • Better still, derive the new environment's prefix from the envs array that the same response already returns — it contains the full path of the environment that was just created.
  • Treat an empty envs_dirs as a failure rather than a value: don't cache it, and require a non-empty array on the cache-hit path.

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par localiser le helper env-dirs et les chemins de cache-hit et de cache-write de CONDA_PREFIXES_KEY décrits dans l’issue. Comparez la réponse de conda info --envs --json avec la réponse non filtrée, puis vérifiez que la création d’un environnement résout correctement son prefix, évite de mettre en cache une valeur envs_dirs vide et ne signale plus un échec erroné.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
typescript, vscode
Domaine
developer-experience, tooling
Type d'issue
Bug
Difficulté
3/5
Temps estimé
1-2 jours
Activité
Active
Clarté
Plutôt claire
Accessibilité débutants
68/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.