Skip to content

Commit 13c005c

Browse files
committed
Merged PR posit-dev/positron-python#290: update the active environment when starting a runtime
Merge pull request #290 from posit-dev/sync-interpreter-changes update the active environment when starting a runtime -------------------- Commit message for posit-dev/positron-python@e5b33b8: Merge remote-tracking branch 'origin/main' into sync-interpreter-changes -------------------- Commit message for posit-dev/positron-python@cf0cf6e: always opt into the pythonTerminalEnvVarActivation experiment -------------------- Commit message for posit-dev/positron-python@5c8409d: update the active environment when starting a runtime Addresses #1491. Authored-by: Wasim Lorgat <[email protected]> Signed-off-by: Wasim Lorgat <[email protected]>
1 parent 8099bf0 commit 13c005c

File tree

4 files changed

+31
-10
lines changed

4 files changed

+31
-10
lines changed

extensions/positron-python/src/client/common/experiments/helpers.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,16 @@ export function inTerminalEnvVarExperiment(experimentService: IExperimentService
1515
traceInfo('Not enabling terminal env var experiment in multiroot remote workspaces');
1616
return false;
1717
}
18+
// --- Start Positron ---
19+
// Always opt into this experiment, as it is more reliable and a better UX than sending
20+
// activation commands like `pyenv shell x.y.z` or `conda activate` to the terminal.
21+
// It also provides a visual indicator in the terminal if the active interpreter changes.
22+
//
23+
// We leave the dead code path below to make merge conflicts easier to resolve.
24+
return true;
25+
// --- End Positron ---
1826
if (!experimentService.inExperimentSync(TerminalEnvVarActivation.experiment)) {
1927
return false;
2028
}
21-
// --- Begin Positron ---
22-
// return true;
23-
return false;
24-
// --- End Positron ---
29+
return true;
2530
}

extensions/positron-python/src/client/positron/extension.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ export async function activatePositron(
2525
traceInfo('activatePositron: registering python runtime provider');
2626
positron.runtime.registerLanguageRuntimeDiscoverer(
2727
'python',
28-
pythonRuntimeDiscoverer(serviceContainer, runtimes, activatedPromise),
28+
pythonRuntimeDiscoverer(serviceContainer, runtimes, activatedPromise, pythonApi),
2929
);
3030

3131
// Wait for all extension components to be activated before registering event listeners
@@ -62,7 +62,7 @@ export async function activatePositron(
6262
if (interpreter) {
6363
// Set recommendedForWorkspace to false, since we change the active runtime
6464
// in the onDidChangeActiveEnvironmentPath listener.
65-
const runtime = await createPythonRuntime(interpreter, serviceContainer, false);
65+
const runtime = await createPythonRuntime(interpreter, serviceContainer, false, pythonApi);
6666
const runtimeMetadata = runtime.metadata;
6767
disposables.push(positron.runtime.registerLanguageRuntime(runtime));
6868
runtimes.set(interpreterPath, runtimeMetadata);

extensions/positron-python/src/client/positron/provider.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import * as positron from 'positron';
1212
import * as semver from 'semver';
1313
import * as vscode from 'vscode';
1414

15+
import { PythonExtension } from '../api/types';
1516
import { EXTENSION_ROOT_DIR, PYTHON_LANGUAGE } from '../common/constants';
1617
import { IConfigurationService, IInstaller } from '../common/types';
1718
import { IServiceContainer } from '../ioc/types';
@@ -37,6 +38,7 @@ export async function* pythonRuntimeDiscoverer(
3738
serviceContainer: IServiceContainer,
3839
runtimes: Map<string, positron.LanguageRuntimeMetadata>,
3940
activatedPromise: Promise<void>,
41+
pythonApi: PythonExtension,
4042
): AsyncGenerator<positron.LanguageRuntime> {
4143
try {
4244
traceInfo('pythonRuntimeProvider: Starting Python runtime provider');
@@ -80,7 +82,12 @@ export async function* pythonRuntimeDiscoverer(
8082
for (const interpreter of interpreters) {
8183
// Only register runtimes for supported versions
8284
if (isVersionSupported(interpreter?.version, '3.8.0')) {
83-
const runtime = await createPythonRuntime(interpreter, serviceContainer, recommendedForWorkspace);
85+
const runtime = await createPythonRuntime(
86+
interpreter,
87+
serviceContainer,
88+
recommendedForWorkspace,
89+
pythonApi,
90+
);
8491

8592
// Ensure we only recommend one runtime for the workspace.
8693
recommendedForWorkspace = false;
@@ -103,6 +110,7 @@ export async function createPythonRuntime(
103110
interpreter: PythonEnvironment,
104111
serviceContainer: IServiceContainer,
105112
recommendedForWorkspace: boolean,
113+
pythonApi: PythonExtension,
106114
): Promise<PythonRuntime> {
107115
traceInfo('createPythonRuntime: getting service instances');
108116
const configService = serviceContainer.get<IConfigurationService>(IConfigurationService);
@@ -245,6 +253,7 @@ export async function createPythonRuntime(
245253
languageClientOptions,
246254
interpreter,
247255
installer,
256+
pythonApi,
248257
extra,
249258
);
250259
}

extensions/positron-python/src/client/positron/runtime.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import * as vscode from 'vscode';
1111
import { cloneDeep } from 'lodash';
1212
import PQueue from 'p-queue';
1313
import { LanguageClientOptions } from 'vscode-languageclient/node';
14+
import { PythonExtension } from '../api/types';
1415
import { InstallOptions } from '../common/installer/types';
1516
import { IInstaller, InstallerResponse, Product } from '../common/types';
1617
import { IServiceContainer } from '../ioc/types';
@@ -59,6 +60,7 @@ export class PythonRuntime implements positron.LanguageRuntime, vscode.Disposabl
5960
readonly languageClientOptions: LanguageClientOptions,
6061
private readonly interpreter: PythonEnvironment,
6162
private readonly installer: IInstaller,
63+
private readonly pythonApi: PythonExtension,
6264
readonly extra?: JupyterKernelExtra,
6365
readonly notebook?: vscode.NotebookDocument,
6466
) {
@@ -194,14 +196,20 @@ export class PythonRuntime implements positron.LanguageRuntime, vscode.Disposabl
194196
if (!this._kernel) {
195197
this._kernel = await this.createKernel();
196198
}
199+
200+
// Ensure that the ipykernel module is installed for the interpreter.
197201
await this._installIpykernel();
198202

203+
// Update the active environment in the Python extension.
204+
this.pythonApi.environments.updateActiveEnvironmentPath(this.interpreter.path);
205+
199206
// Register for console width changes, if we haven't already
200207
if (!this._consoleWidthDisposable) {
201208
this._consoleWidthDisposable = positron.window.onDidChangeConsoleWidth((newWidth) => {
202209
this.onConsoleWidthChange(newWidth);
203210
});
204211
}
212+
205213
return this._kernel.start();
206214
}
207215

@@ -223,9 +231,7 @@ export class PythonRuntime implements positron.LanguageRuntime, vscode.Disposabl
223231
// Log the error if we can't set the console width; this is not
224232
// fatal, so we don't rethrow the error
225233
const runtimeError = err as positron.RuntimeMethodError;
226-
this._kernel.emitJupyterLog(
227-
`Error setting console width: ${runtimeError.message} (${runtimeError.code})`,
228-
);
234+
this._kernel.emitJupyterLog(`Error setting console width: ${runtimeError.message} (${runtimeError.code})`);
229235
}
230236
}
231237

@@ -345,6 +351,7 @@ export class PythonRuntime implements positron.LanguageRuntime, vscode.Disposabl
345351
cloneDeep(this.languageClientOptions),
346352
cloneDeep(this.interpreter),
347353
this.installer,
354+
this.pythonApi,
348355
createJupyterKernelExtra(),
349356
notebook,
350357
);

0 commit comments

Comments
 (0)