Source code for pyiron_base.project.condaenv
import os
import subprocess
import warnings
from conda.core.envs_manager import list_all_known_prefixes
[docs]
class CondaEnvironment:
[docs]
def __init__(self, env_path: str):
"""
Initialize a CondaEnvironment object.
Args:
env_path (str): The path to the conda environment.
"""
self._env_path = env_path
def __dir__(self):
return list(self._list_all_known_prefixes_dict().keys()) + ["create"]
@staticmethod
def _list_all_known_prefixes_dict() -> dict:
"""
Return a dictionary of all known conda environment prefixes.
Returns:
dict: A dictionary of conda environment prefixes.
"""
return {os.path.basename(path): path for path in list_all_known_prefixes()}
def __getattr__(self, item: str) -> str:
item_dict = {os.path.basename(path): path for path in list_all_known_prefixes()}
if item in item_dict.keys():
return item_dict[item]
else:
raise AttributeError(
f"Unknown conda environment {item}. Use one of {self._list_all_known_prefixes_dict()} or create a new one."
)
[docs]
def create(
self,
env_name: str,
env_file: str,
use_mamba: bool = False,
global_installation: bool = True,
) -> None:
"""
Create a new conda environment.
Args:
env_name (str): The name of the new environment.
env_file (str): The path to the environment file.
use_mamba (bool, optional): Whether to use mamba instead of conda. Defaults to False.
global_installation (bool, optional): Whether to install the environment globally. Defaults to True.
Raises:
subprocess.CalledProcessError: If the environment creation command fails.
"""
exe = "mamba" if use_mamba else "conda"
env_lst = list_all_known_prefixes()
env_path = os.path.join(os.path.abspath(self._env_path), env_name)
if env_name not in env_lst and env_path not in env_lst:
command_lst = [
exe,
"env",
"create",
]
if not global_installation:
os.makedirs(self._env_path, exist_ok=True)
command_lst += [
"--prefix",
env_path,
]
command_lst += [
"-f",
env_file,
"-y",
]
subprocess.check_output(
command_lst,
universal_newlines=True,
)
else:
warnings.warn(
"The conda environment "
+ env_name
+ " already exists in "
+ str(env_path)
+ "."
)