From cadcc74fb6521fb01ec085e6b7f31b6ad93e25fb Mon Sep 17 00:00:00 2001 From: eleanorjboyd <26030610+eleanorjboyd@users.noreply.github.com> Date: Fri, 22 Aug 2025 09:34:53 -0700 Subject: [PATCH 1/4] update readme for current environment manager support --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index f9cac275..906dc73a 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,8 @@ The following environment managers are supported out of the box: Environment managers are responsible for specifying which package manager will be used by default to install and manage Python packages within the environment (`venv` uses `pip` by default). This ensures that packages are managed consistently according to the preferred tools and settings of the chosen environment manager. + + ### Package Management The extension also provides an interface to install and uninstall Python packages, and provides APIs for extension developers to contribute package managers of their choice. From 8ee4040a15cf099cd8f66d19b49fdffd0ad157f0 Mon Sep 17 00:00:00 2001 From: eleanorjboyd <26030610+eleanorjboyd@users.noreply.github.com> Date: Fri, 22 Aug 2025 09:36:34 -0700 Subject: [PATCH 2/4] formatting --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 906dc73a..f9cac275 100644 --- a/README.md +++ b/README.md @@ -63,8 +63,6 @@ The following environment managers are supported out of the box: Environment managers are responsible for specifying which package manager will be used by default to install and manage Python packages within the environment (`venv` uses `pip` by default). This ensures that packages are managed consistently according to the preferred tools and settings of the chosen environment manager. - - ### Package Management The extension also provides an interface to install and uninstall Python packages, and provides APIs for extension developers to contribute package managers of their choice. From 88a9c6dc5ab4e2a7054254733475f2b015329f6f Mon Sep 17 00:00:00 2001 From: eleanorjboyd <26030610+eleanorjboyd@users.noreply.github.com> Date: Fri, 22 Aug 2025 13:47:09 -0700 Subject: [PATCH 3/4] add resolution for default interpreter and respect setting --- src/extension.ts | 61 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/src/extension.ts b/src/extension.ts index 159ee260..6af6df6e 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -72,6 +72,7 @@ import { SysPythonManager } from './managers/builtin/sysPythonManager'; import { createNativePythonFinder, getNativePythonToolsPath, + NativeEnvInfo, NativePythonFinder, } from './managers/common/nativePythonFinder'; import { IDisposable } from './managers/common/types'; @@ -568,6 +569,8 @@ export async function activate(context: ExtensionContext): Promise { ); } +/** + * Resolves and sets the default Python interpreter for the workspace based on the + * 'python.defaultInterpreterPath' setting and the selected environment manager. + * If the setting is present and no default environment manager is set (or is venv), + * attempts to resolve the interpreter path using the native finder, then creates and + * sets a PythonEnvironment object for the workspace. + * + * @param nativeFinder - The NativePythonFinder instance used to resolve interpreter paths. + * @param envManagers - The EnvironmentManagers instance containing all registered managers. + * @param api - The PythonEnvironmentApi for environment resolution and setting. + */ +async function resolveDefaultInterpreter( + nativeFinder: NativePythonFinder, + envManagers: EnvironmentManagers, + api: PythonEnvironmentApi, +) { + const defaultInterpreterPath = getConfiguration('python').get('defaultInterpreterPath'); + + if (defaultInterpreterPath) { + const defaultManager = getConfiguration('python-envs').get('defaultEnvManager', 'undefined'); + if (!defaultManager || defaultManager === 'ms-python.python:venv') { + // if user has defaultInterpreterPath and no defaultEnvManager set then resolve the defaultInterpreterPath setting + const resolved: NativeEnvInfo = await nativeFinder.resolve(defaultInterpreterPath); + if (resolved && resolved.executable) { + const resolvedEnv = await api.resolveEnvironment(Uri.file(resolved.executable)); + + let findEnvManager = envManagers.managers.find((m) => m.id === resolvedEnv?.envId.managerId); + + if (!findEnvManager) { + findEnvManager = envManagers.managers.find((m) => m.id === 'ms-python.python:system'); + } + if (resolvedEnv) { + const newEnv: PythonEnvironment = { + envId: { + id: resolvedEnv?.envId.id, + managerId: resolvedEnv?.envId.managerId ?? '', + }, + name: 'defaultInterpreterPath: ' + (resolved.version ?? ''), + displayName: 'defaultInterpreterPath: ' + (resolved.version ?? ''), + version: resolved.version ?? '', + displayPath: defaultInterpreterPath ?? '', + environmentPath: defaultInterpreterPath ? Uri.file(defaultInterpreterPath) : Uri.file(''), + sysPrefix: resolved.arch ?? '', + execInfo: { + run: { + executable: defaultInterpreterPath ?? '', + }, + }, + }; + if (workspace.workspaceFolders?.[0] && findEnvManager) { + await api.setEnvironment(workspace.workspaceFolders[0].uri, newEnv); + } + } + } + } + } +} + export async function deactivate(context: ExtensionContext) { await disposeAll(context.subscriptions); context.subscriptions.length = 0; // Clear subscriptions to prevent memory leaks From 3fbb0a3f9a4315b51d655fd466905abd674bcd83 Mon Sep 17 00:00:00 2001 From: eleanorjboyd <26030610+eleanorjboyd@users.noreply.github.com> Date: Fri, 22 Aug 2025 13:53:54 -0700 Subject: [PATCH 4/4] add logging --- src/extension.ts | 69 ++++++++++++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 29 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index 6af6df6e..e9e780f3 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -614,39 +614,50 @@ async function resolveDefaultInterpreter( if (defaultInterpreterPath) { const defaultManager = getConfiguration('python-envs').get('defaultEnvManager', 'undefined'); + traceInfo(`resolveDefaultInterpreter setting exists; found defaultEnvManager: ${defaultManager}`); if (!defaultManager || defaultManager === 'ms-python.python:venv') { - // if user has defaultInterpreterPath and no defaultEnvManager set then resolve the defaultInterpreterPath setting - const resolved: NativeEnvInfo = await nativeFinder.resolve(defaultInterpreterPath); - if (resolved && resolved.executable) { - const resolvedEnv = await api.resolveEnvironment(Uri.file(resolved.executable)); - - let findEnvManager = envManagers.managers.find((m) => m.id === resolvedEnv?.envId.managerId); - - if (!findEnvManager) { - findEnvManager = envManagers.managers.find((m) => m.id === 'ms-python.python:system'); - } - if (resolvedEnv) { - const newEnv: PythonEnvironment = { - envId: { - id: resolvedEnv?.envId.id, - managerId: resolvedEnv?.envId.managerId ?? '', - }, - name: 'defaultInterpreterPath: ' + (resolved.version ?? ''), - displayName: 'defaultInterpreterPath: ' + (resolved.version ?? ''), - version: resolved.version ?? '', - displayPath: defaultInterpreterPath ?? '', - environmentPath: defaultInterpreterPath ? Uri.file(defaultInterpreterPath) : Uri.file(''), - sysPrefix: resolved.arch ?? '', - execInfo: { - run: { - executable: defaultInterpreterPath ?? '', + try { + const resolved: NativeEnvInfo = await nativeFinder.resolve(defaultInterpreterPath); + if (resolved && resolved.executable) { + const resolvedEnv = await api.resolveEnvironment(Uri.file(resolved.executable)); + traceInfo(`[resolveDefaultInterpreter] API resolved environment: ${JSON.stringify(resolvedEnv)}`); + + let findEnvManager = envManagers.managers.find((m) => m.id === resolvedEnv?.envId.managerId); + if (!findEnvManager) { + findEnvManager = envManagers.managers.find((m) => m.id === 'ms-python.python:system'); + } + if (resolvedEnv) { + const newEnv: PythonEnvironment = { + envId: { + id: resolvedEnv?.envId.id, + managerId: resolvedEnv?.envId.managerId ?? '', }, - }, - }; - if (workspace.workspaceFolders?.[0] && findEnvManager) { - await api.setEnvironment(workspace.workspaceFolders[0].uri, newEnv); + name: 'defaultInterpreterPath: ' + (resolved.version ?? ''), + displayName: 'defaultInterpreterPath: ' + (resolved.version ?? ''), + version: resolved.version ?? '', + displayPath: defaultInterpreterPath ?? '', + environmentPath: defaultInterpreterPath ? Uri.file(defaultInterpreterPath) : Uri.file(''), + sysPrefix: resolved.arch ?? '', + execInfo: { + run: { + executable: defaultInterpreterPath ?? '', + }, + }, + }; + if (workspace.workspaceFolders?.[0] && findEnvManager) { + traceInfo( + `[resolveDefaultInterpreter] Setting environment for workspace: ${workspace.workspaceFolders[0].uri.fsPath}`, + ); + await api.setEnvironment(workspace.workspaceFolders[0].uri, newEnv); + } } + } else { + traceWarn( + `[resolveDefaultInterpreter] NativeFinder did not resolve an executable for path: ${defaultInterpreterPath}`, + ); } + } catch (err) { + traceError(`[resolveDefaultInterpreter] Error resolving default interpreter: ${err}`); } } }