@@ -258,7 +258,24 @@ fn check_if_pyenv_virtualenv_exists() {
258258
259259fn verify_validity_of_interpreter_info ( environment : PythonEnvironment ) {
260260 let run_command = get_python_run_command ( & environment) ;
261- let interpreter_info = get_python_interpreter_info ( & run_command) ;
261+ let interpreter_info = match get_python_interpreter_info ( & run_command) {
262+ Some ( info) => info,
263+ None => {
264+ // Conda base environments on CI runners can return empty output due to
265+ // activation issues. Skip gracefully for Conda; fail for everything else.
266+ if environment. kind == Some ( PythonEnvironmentKind :: Conda ) {
267+ warn ! (
268+ "Skipping interpreter info validation for Conda env {:?} (command returned no output)" ,
269+ environment
270+ ) ;
271+ return ;
272+ }
273+ panic ! (
274+ "Failed to get interpreter info for {:?} (command returned no output)" ,
275+ environment
276+ ) ;
277+ }
278+ } ;
262279
263280 // Home brew has too many syminks, unfortunately its not easy to test in CI.
264281 if environment. kind != Some ( PythonEnvironmentKind :: Homebrew ) {
@@ -788,25 +805,36 @@ fn get_python_run_command(env: &PythonEnvironment) -> Vec<String> {
788805 }
789806}
790807
791- fn get_python_interpreter_info ( cli : & [ String ] ) -> InterpreterInfo {
808+ fn get_python_interpreter_info ( cli : & [ String ] ) -> Option < InterpreterInfo > {
792809 let mut cli = cli. to_owned ( ) ;
793810 cli. push (
794811 resolve_test_path ( & [ "interpreterInfo.py" ] )
795812 . to_str ( )
796813 . unwrap_or_default ( )
797814 . to_string ( ) ,
798815 ) ;
799- // Spawn `conda --version` to get the version of conda as a string
800- let output = std:: process:: Command :: new ( cli. first ( ) . unwrap ( ) )
816+ let output = std:: process:: Command :: new ( cli. first ( ) . expect ( "empty cli" ) )
801817 . args ( & cli[ 1 ..] )
802818 . output ( )
803819 . unwrap_or_else ( |_| panic ! ( "Failed to execute command {cli:?}" ) ) ;
804- let output = String :: from_utf8 ( output. stdout ) . unwrap ( ) ;
805- trace ! ( "Get Interpreter Info: {:?} => {:?}" , cli, output) ;
806- let output = output
807- . split_once ( "503bebe7-c838-4cea-a1bc-0f2963bcb657" )
808- . unwrap ( )
809- . 1 ;
810- let info: InterpreterInfo = serde_json:: from_str ( output) . unwrap ( ) ;
811- info
820+ let exit_status = output. status ;
821+ let stdout = String :: from_utf8 ( output. stdout ) . unwrap_or_default ( ) ;
822+ let stderr = String :: from_utf8 ( output. stderr ) . unwrap_or_default ( ) ;
823+ trace ! ( "Get Interpreter Info: {:?} => {:?}" , cli, stdout) ;
824+ if let Some ( ( _, json_part) ) = stdout. split_once ( "503bebe7-c838-4cea-a1bc-0f2963bcb657" ) {
825+ match serde_json:: from_str ( json_part) {
826+ Ok ( info) => Some ( info) ,
827+ Err ( e) => {
828+ warn ! (
829+ "Failed to parse interpreter info for {cli:?}: {e}, exit: {exit_status}, stdout: {stdout:?}, stderr: {stderr:?}"
830+ ) ;
831+ None
832+ }
833+ }
834+ } else {
835+ warn ! (
836+ "Failed to get interpreter info for {cli:?}: marker not found in output, exit: {exit_status}, stdout: {stdout:?}, stderr: {stderr:?}"
837+ ) ;
838+ None
839+ }
812840}
0 commit comments