@@ -16,7 +16,7 @@ import { sleep } from '../../common/utils/async';
1616import { InMemoryCache } from '../../common/utils/cacheUtils' ;
1717import { OSType } from '../../common/utils/platform' ;
1818import { IEnvironmentVariablesProvider } from '../../common/variables/types' ;
19- import { PythonEnvironment } from '../../pythonEnvironments/info' ;
19+ import { EnvironmentType , PythonEnvironment } from '../../pythonEnvironments/info' ;
2020import { captureTelemetry , sendTelemetryEvent } from '../../telemetry' ;
2121import { EventName } from '../../telemetry/constants' ;
2222import { IInterpreterService } from '../contracts' ;
@@ -30,6 +30,7 @@ import {
3030 traceVerbose ,
3131 traceWarn ,
3232} from '../../logging' ;
33+ import { Conda } from '../../pythonEnvironments/common/environmentManagers/conda' ;
3334
3435const ENVIRONMENT_PREFIX = 'e8b39361-0157-4923-80e1-22d70d46dee6' ;
3536const CACHE_DURATION = 10 * 60 * 1000 ;
@@ -169,20 +170,41 @@ export class EnvironmentActivationService implements IEnvironmentActivationServi
169170 if ( ! shellInfo ) {
170171 return ;
171172 }
172- let isPossiblyCondaEnv = false ;
173173 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 . toCommandArgument ( ) ;
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 . toCommandArgument ( ) ) . 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 ( ' ' ) } ` ;
182206 }
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+
186208 const processService = await this . processServiceFactory . create ( resource ) ;
187209 const customEnvVars = await this . envVarsService . getEnvironmentVariables ( resource ) ;
188210 const hasCustomEnvVars = Object . keys ( customEnvVars ) . length ;
@@ -194,14 +216,6 @@ export class EnvironmentActivationService implements IEnvironmentActivationServi
194216 env [ PYTHON_WARNINGS ] = 'ignore' ;
195217
196218 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 . toCommandArgument ( ) ;
203- } ) ;
204- const command = `${ activationCommand } && echo '${ ENVIRONMENT_PREFIX } ' && python ${ args . join ( ' ' ) } ` ;
205219 traceVerbose ( `Activating Environment to capture Environment variables, ${ command } ` ) ;
206220
207221 // Do some wrapping of the call. For two reasons:
@@ -219,7 +233,10 @@ export class EnvironmentActivationService implements IEnvironmentActivationServi
219233 result = await processService . shellExec ( command , {
220234 env,
221235 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 ,
223240 maxBuffer : 1000 * 1000 ,
224241 throwOnStdErr : false ,
225242 } ) ;
@@ -265,7 +282,7 @@ export class EnvironmentActivationService implements IEnvironmentActivationServi
265282 } catch ( e ) {
266283 traceError ( 'getActivatedEnvironmentVariables' , e ) ;
267284 sendTelemetryEvent ( EventName . ACTIVATE_ENV_TO_GET_ENV_VARS_FAILED , undefined , {
268- isPossiblyCondaEnv,
285+ isPossiblyCondaEnv : interpreter ?. envType === EnvironmentType . Conda ,
269286 terminal : shellInfo . shellType ,
270287 } ) ;
271288
@@ -283,6 +300,9 @@ export class EnvironmentActivationService implements IEnvironmentActivationServi
283300 @traceDecoratorError ( 'Failed to parse Environment variables' )
284301 @traceDecoratorVerbose ( 'parseEnvironmentOutput' , TraceOptions . None )
285302 protected parseEnvironmentOutput ( output : string , parse : ( out : string ) => NodeJS . ProcessEnv | undefined ) {
303+ if ( output . indexOf ( ENVIRONMENT_PREFIX ) === - 1 ) {
304+ return parse ( output ) ;
305+ }
286306 output = output . substring ( output . indexOf ( ENVIRONMENT_PREFIX ) + ENVIRONMENT_PREFIX . length ) ;
287307 const js = output . substring ( output . indexOf ( '{' ) ) . trim ( ) ;
288308 return parse ( js ) ;
0 commit comments