@@ -16,7 +16,7 @@ import { sleep } from '../../common/utils/async';
16
16
import { InMemoryCache } from '../../common/utils/cacheUtils' ;
17
17
import { OSType } from '../../common/utils/platform' ;
18
18
import { IEnvironmentVariablesProvider } from '../../common/variables/types' ;
19
- import { PythonEnvironment } from '../../pythonEnvironments/info' ;
19
+ import { EnvironmentType , PythonEnvironment } from '../../pythonEnvironments/info' ;
20
20
import { captureTelemetry , sendTelemetryEvent } from '../../telemetry' ;
21
21
import { EventName } from '../../telemetry/constants' ;
22
22
import { IInterpreterService } from '../contracts' ;
@@ -30,6 +30,7 @@ import {
30
30
traceVerbose ,
31
31
traceWarn ,
32
32
} from '../../logging' ;
33
+ import { Conda } from '../../pythonEnvironments/common/environmentManagers/conda' ;
33
34
34
35
const ENVIRONMENT_PREFIX = 'e8b39361-0157-4923-80e1-22d70d46dee6' ;
35
36
const CACHE_DURATION = 10 * 60 * 1000 ;
@@ -169,20 +170,41 @@ export class EnvironmentActivationService implements IEnvironmentActivationServi
169
170
if ( ! shellInfo ) {
170
171
return ;
171
172
}
172
- let isPossiblyCondaEnv = false ;
173
173
try {
174
- const activationCommands = await this . helper . getEnvironmentActivationShellCommands (
175
- resource ,
176
- shellInfo . shellType ,
177
- interpreter ,
178
- ) ;
179
- traceVerbose ( `Activation Commands received ${ activationCommands } for shell ${ shellInfo . shell } ` ) ;
180
- if ( ! activationCommands || ! Array . isArray ( activationCommands ) || activationCommands . length === 0 ) {
181
- return ;
174
+ let command : string | undefined ;
175
+ let [ args , parse ] = internalScripts . printEnvVariables ( ) ;
176
+ args . forEach ( ( arg , i ) => {
177
+ args [ i ] = arg . toCommandArgumentForPythonExt ( ) ;
178
+ } ) ;
179
+ interpreter = interpreter ?? ( await this . interpreterService . getActiveInterpreter ( resource ) ) ;
180
+ if ( interpreter ?. envType === EnvironmentType . Conda ) {
181
+ const conda = await Conda . getConda ( ) ;
182
+ const pythonArgv = await conda ?. getRunPythonArgs ( {
183
+ name : interpreter . envName ,
184
+ prefix : interpreter . envPath ?? '' ,
185
+ } ) ;
186
+ if ( pythonArgv ) {
187
+ // Using environment prefix isn't needed as the marker script already takes care of it.
188
+ command = [ ...pythonArgv , ...args ] . map ( ( arg ) => arg . toCommandArgumentForPythonExt ( ) ) . join ( ' ' ) ;
189
+ }
190
+ }
191
+ if ( ! command ) {
192
+ const activationCommands = await this . helper . getEnvironmentActivationShellCommands (
193
+ resource ,
194
+ shellInfo . shellType ,
195
+ interpreter ,
196
+ ) ;
197
+ traceVerbose ( `Activation Commands received ${ activationCommands } for shell ${ shellInfo . shell } ` ) ;
198
+ if ( ! activationCommands || ! Array . isArray ( activationCommands ) || activationCommands . length === 0 ) {
199
+ return ;
200
+ }
201
+ // Run the activate command collect the environment from it.
202
+ const activationCommand = this . fixActivationCommands ( activationCommands ) . join ( ' && ' ) ;
203
+ // In order to make sure we know where the environment output is,
204
+ // put in a dummy echo we can look for
205
+ command = `${ activationCommand } && echo '${ ENVIRONMENT_PREFIX } ' && python ${ args . join ( ' ' ) } ` ;
182
206
}
183
- isPossiblyCondaEnv = activationCommands . join ( ' ' ) . toLowerCase ( ) . includes ( 'conda' ) ;
184
- // Run the activate command collect the environment from it.
185
- const activationCommand = this . fixActivationCommands ( activationCommands ) . join ( ' && ' ) ;
207
+
186
208
const processService = await this . processServiceFactory . create ( resource ) ;
187
209
const customEnvVars = await this . envVarsService . getEnvironmentVariables ( resource ) ;
188
210
const hasCustomEnvVars = Object . keys ( customEnvVars ) . length ;
@@ -194,14 +216,6 @@ export class EnvironmentActivationService implements IEnvironmentActivationServi
194
216
env [ PYTHON_WARNINGS ] = 'ignore' ;
195
217
196
218
traceVerbose ( `${ hasCustomEnvVars ? 'Has' : 'No' } Custom Env Vars` ) ;
197
-
198
- // In order to make sure we know where the environment output is,
199
- // put in a dummy echo we can look for
200
- const [ args , parse ] = internalScripts . printEnvVariables ( ) ;
201
- args . forEach ( ( arg , i ) => {
202
- args [ i ] = arg . toCommandArgumentForPythonExt ( ) ;
203
- } ) ;
204
- const command = `${ activationCommand } && echo '${ ENVIRONMENT_PREFIX } ' && python ${ args . join ( ' ' ) } ` ;
205
219
traceVerbose ( `Activating Environment to capture Environment variables, ${ command } ` ) ;
206
220
207
221
// Do some wrapping of the call. For two reasons:
@@ -219,7 +233,10 @@ export class EnvironmentActivationService implements IEnvironmentActivationServi
219
233
result = await processService . shellExec ( command , {
220
234
env,
221
235
shell : shellInfo . shell ,
222
- timeout : isPossiblyCondaEnv ? CONDA_ENVIRONMENT_TIMEOUT : ENVIRONMENT_TIMEOUT ,
236
+ timeout :
237
+ interpreter ?. envType === EnvironmentType . Conda
238
+ ? CONDA_ENVIRONMENT_TIMEOUT
239
+ : ENVIRONMENT_TIMEOUT ,
223
240
maxBuffer : 1000 * 1000 ,
224
241
throwOnStdErr : false ,
225
242
} ) ;
@@ -265,7 +282,7 @@ export class EnvironmentActivationService implements IEnvironmentActivationServi
265
282
} catch ( e ) {
266
283
traceError ( 'getActivatedEnvironmentVariables' , e ) ;
267
284
sendTelemetryEvent ( EventName . ACTIVATE_ENV_TO_GET_ENV_VARS_FAILED , undefined , {
268
- isPossiblyCondaEnv,
285
+ isPossiblyCondaEnv : interpreter ?. envType === EnvironmentType . Conda ,
269
286
terminal : shellInfo . shellType ,
270
287
} ) ;
271
288
@@ -283,6 +300,9 @@ export class EnvironmentActivationService implements IEnvironmentActivationServi
283
300
@traceDecoratorError ( 'Failed to parse Environment variables' )
284
301
@traceDecoratorVerbose ( 'parseEnvironmentOutput' , TraceOptions . None )
285
302
protected parseEnvironmentOutput ( output : string , parse : ( out : string ) => NodeJS . ProcessEnv | undefined ) {
303
+ if ( output . indexOf ( ENVIRONMENT_PREFIX ) === - 1 ) {
304
+ return parse ( output ) ;
305
+ }
286
306
output = output . substring ( output . indexOf ( ENVIRONMENT_PREFIX ) + ENVIRONMENT_PREFIX . length ) ;
287
307
const js = output . substring ( output . indexOf ( '{' ) ) . trim ( ) ;
288
308
return parse ( js ) ;
0 commit comments