Skip to content

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

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions