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)

Open
#1,766 0 comments 0 reactions 0 assignees View on GitHub
triage-needed
Dominant language
TypeScript
Stars
138
Forks
62
Avg merge
1d 4h
Merged PRs (30d)
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 Environment** → **Conda** → **Named** (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:

```js
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`:

```console
$ 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:

```js
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.

Contributor guide

Open the contributing guide

Research direction

Start by locating the env-dirs helper and the CONDA_PREFIXES_KEY cache-hit and cache-write paths described in the issue. Compare the conda info --envs --json response with the unfiltered response, then verify that creating an environment resolves its prefix successfully, avoids caching an empty envs_dirs value, and no longer reports a false failure.

Written by the indexing model from the issue text.

Assessment

Tech stack
typescript, vscode
Domain
developer-experience, tooling
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
68/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.