11from __future__ import annotations
22
3+ import logging
34import shutil
45import subprocess
56from pathlib import Path
1112
1213MINIMUM_PIXI_VERSION = "0.30.0"
1314
15+ logger = logging .getLogger (__name__ )
16+
1417
1518class PixiInfo (BaseModel ):
1619 environments : list [Environment ] = Field (alias = "environments_info" )
@@ -28,7 +31,13 @@ class Project(BaseModel):
2831 manifest_path : str
2932
3033
31- def ensure_readiness (* , cwd : Path , required_package : str , kernel_name : str ) -> Environment :
34+ def ensure_readiness (
35+ * ,
36+ cwd : Path ,
37+ env : dict [str , str ],
38+ required_package : str ,
39+ kernel_name : str ,
40+ ) -> Environment :
3241 """Ensure the Pixi environment is ready to run the kernel.
3342
3443 This function checks the following:
@@ -43,12 +52,16 @@ def ensure_readiness(*, cwd: Path, required_package: str, kernel_name: str) -> E
4352
4453 Returns the path to the Pixi environment prefix.
4554 """
55+ # Remove PIXI_IN_SHELL for when JupyterLab is started from a Pixi shell
56+ # https://github.com/renan-r-santos/pixi-kernel/issues/35
57+ env .pop ("PIXI_IN_SHELL" , None )
58+
4659 # Ensure Pixi is in PATH
4760 if shutil .which ("pixi" ) is None :
4861 raise RuntimeError (PIXI_NOT_FOUND .format (kernel_name = kernel_name ))
4962
5063 # Ensure a supported Pixi version is installed
51- result = subprocess .run (["pixi" , "--version" ], capture_output = True , text = True )
64+ result = subprocess .run (["pixi" , "--version" ], capture_output = True , env = env , text = True )
5265 if result .returncode != 0 or not result .stdout .startswith ("pixi " ):
5366 raise RuntimeError (PIXI_VERSION_ERROR .format (kernel_name = kernel_name ))
5467
@@ -66,10 +79,13 @@ def ensure_readiness(*, cwd: Path, required_package: str, kernel_name: str) -> E
6679 # Ensure there is a Pixi project in the current working directory or any of its parents
6780 result = subprocess .run (
6881 ["pixi" , "info" , "--json" ],
69- cwd = str ( cwd . absolute ()) ,
82+ cwd = cwd ,
7083 capture_output = True ,
84+ env = env ,
7185 text = True ,
7286 )
87+ logger .info (f"pixi info stderr: { result .stderr } " )
88+ logger .info (f"pixi info stdout: { result .stdout } " )
7389 if result .returncode != 0 :
7490 raise RuntimeError (f"Failed to run 'pixi info': { result .stderr } " )
7591
@@ -85,16 +101,17 @@ def ensure_readiness(*, cwd: Path, required_package: str, kernel_name: str) -> E
85101 # a typo in the toml file (parsing error) or there is no project at all.
86102 result = subprocess .run (
87103 ["pixi" , "project" , "version" , "get" ],
88- cwd = str ( cwd . absolute ()) ,
104+ cwd = cwd ,
89105 capture_output = True ,
106+ env = env ,
90107 text = True ,
91108 )
92109 raise RuntimeError (result .stderr )
93110
94111 # Find the default environment and check if the required kernel package is a dependency
95- for env in pixi_info .environments :
96- if env .name == "default" :
97- default_environment = env
112+ for pixi_env in pixi_info .environments :
113+ if pixi_env .name == "default" :
114+ default_environment = pixi_env
98115 break
99116 else :
100117 raise RuntimeError ("Default Pixi environment not found." )
@@ -103,17 +120,14 @@ def ensure_readiness(*, cwd: Path, required_package: str, kernel_name: str) -> E
103120 if required_package not in dependencies :
104121 raise RuntimeError (
105122 PIXI_KERNEL_NOT_FOUND .format (
106- kernel_name = kernel_name , required_package = required_package
123+ kernel_name = kernel_name ,
124+ required_package = required_package ,
125+ prefix = default_environment .prefix ,
107126 )
108127 )
109128
110129 # Make sure the environment can be solved and is up-to-date
111- result = subprocess .run (
112- ["pixi" , "install" ],
113- cwd = str (cwd .absolute ()),
114- capture_output = True ,
115- text = True ,
116- )
130+ result = subprocess .run (["pixi" , "install" ], cwd = cwd , capture_output = True , env = env , text = True )
117131 if result .returncode != 0 :
118132 raise RuntimeError (f"Failed to run 'pixi install': { result .stderr } " )
119133
0 commit comments