From 18676c2847448b3a72e3bfe359373623e3f56fe2 Mon Sep 17 00:00:00 2001 From: Eleanor Boyd <26030610+eleanorjboyd@users.noreply.github.com> Date: Mon, 25 Aug 2025 11:48:39 -0700 Subject: [PATCH] fix getInterpreterDetails to include quotes if necessary (#790) --- src/extension/common/python.ts | 42 ++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/src/extension/common/python.ts b/src/extension/common/python.ts index a82fb559..f6a893cc 100644 --- a/src/extension/common/python.ts +++ b/src/extension/common/python.ts @@ -2,7 +2,13 @@ // Licensed under the MIT License. /* eslint-disable @typescript-eslint/naming-convention */ -import { Environment, EnvironmentPath, PythonExtension, Resource } from '@vscode/python-extension'; +import { + ActiveEnvironmentPathChangeEvent, + Environment, + EnvironmentPath, + PythonExtension, + Resource, +} from '@vscode/python-extension'; import { commands, EventEmitter, extensions, Uri, Event, Disposable } from 'vscode'; import { createDeferred } from './utils/async'; import { traceError, traceLog } from './log/logging'; @@ -22,12 +28,25 @@ export interface IInterpreterDetails { const onDidChangePythonInterpreterEvent = new EventEmitter(); export const onDidChangePythonInterpreter: Event = onDidChangePythonInterpreterEvent.event; async function activateExtension() { + console.log('Activating Python extension...'); + activateEnvsExtension(); const extension = extensions.getExtension('ms-python.python'); if (extension) { if (!extension.isActive) { await extension.activate(); } } + console.log('Python extension activated.'); + return extension; +} + +async function activateEnvsExtension() { + const extension = extensions.getExtension('ms-python.vscode-python-envs'); + if (extension) { + if (!extension.isActive) { + await extension.activate(); + } + } return extension; } @@ -48,8 +67,16 @@ export async function initializePython(disposables: Disposable[]): Promise if (api) { disposables.push( - api.environments.onDidChangeActiveEnvironmentPath((e) => { - onDidChangePythonInterpreterEvent.fire({ path: [e.path], resource: e.resource?.uri }); + api.environments.onDidChangeActiveEnvironmentPath((e: ActiveEnvironmentPathChangeEvent) => { + let resourceUri: Uri | undefined; + if (e.resource instanceof Uri) { + resourceUri = e.resource; + } + if (e.resource && 'uri' in e.resource) { + // WorkspaceFolder type + resourceUri = e.resource.uri; + } + onDidChangePythonInterpreterEvent.fire({ path: [e.path], resource: resourceUri }); }), ); @@ -89,8 +116,13 @@ export async function getActiveEnvironmentPath(resource?: Resource) { export async function getInterpreterDetails(resource?: Uri): Promise { const api = await getPythonExtensionEnviromentAPI(); const environment = await api.environments.resolveEnvironment(api.environments.getActiveEnvironmentPath(resource)); - if (environment?.executable.uri) { - return { path: [environment?.executable.uri.fsPath], resource }; + const rawExecPath = environment?.executable.uri?.fsPath; + if (rawExecPath) { + let execPath = rawExecPath; + if (rawExecPath.includes(' ') && !(rawExecPath.startsWith('"') && rawExecPath.endsWith('"'))) { + execPath = `"${rawExecPath}"`; + } + return { path: [execPath], resource }; } return { path: undefined, resource }; }