Environment
zenml.environment
Environment implementation.
Environment
Provides environment information.
Individual environment components can be registered separately to extend
the global Environment object with additional information (see
BaseEnvironmentComponent
).
Source code in zenml/environment.py
class Environment(metaclass=SingletonMetaClass):
"""Provides environment information.
Individual environment components can be registered separately to extend
the global Environment object with additional information (see
`BaseEnvironmentComponent`).
"""
def __init__(self) -> None:
"""Initializes an Environment instance.
Note: Environment is a singleton class, which means this method will
only get called once. All following `Environment()` calls will return
the previously initialized instance.
"""
@staticmethod
def get_system_info() -> Dict[str, str]:
"""Information about the operating system.
Returns:
A dictionary containing information about the operating system.
"""
system = platform.system()
if system == "Windows":
release, version, csd, ptype = platform.win32_ver()
return {
"os": "windows",
"windows_version_release": release,
"windows_version": version,
"windows_version_service_pack": csd,
"windows_version_os_type": ptype,
}
if system == "Darwin":
return {"os": "mac", "mac_version": platform.mac_ver()[0]}
if system == "Linux":
return {
"os": "linux",
"linux_distro": distro.id(),
"linux_distro_like": distro.like(),
"linux_distro_version": distro.version(),
}
# We don't collect data for any other system.
return {"os": "unknown"}
@staticmethod
def python_version() -> str:
"""Returns the python version of the running interpreter.
Returns:
str: the python version
"""
return platform.python_version()
@staticmethod
def in_container() -> bool:
"""If the current python process is running in a container.
Returns:
`True` if the current python process is running in a
container, `False` otherwise.
"""
# TODO [ENG-167]: Make this more reliable and add test.
return INSIDE_ZENML_CONTAINER
@staticmethod
def in_docker() -> bool:
"""If the current python process is running in a docker container.
Returns:
`True` if the current python process is running in a docker
container, `False` otherwise.
"""
if os.path.exists("./dockerenv") or os.path.exists("/.dockerinit"):
return True
try:
with open("/proc/1/cgroup", "rt") as ifh:
info = ifh.read()
return "docker" in info
except (FileNotFoundError, Exception):
return False
@staticmethod
def in_kubernetes() -> bool:
"""If the current python process is running in a kubernetes pod.
Returns:
`True` if the current python process is running in a kubernetes
pod, `False` otherwise.
"""
if "KUBERNETES_SERVICE_HOST" in os.environ:
return True
try:
with open("/proc/1/cgroup", "rt") as ifh:
info = ifh.read()
return "kubepod" in info
except (FileNotFoundError, Exception):
return False
@staticmethod
def in_google_colab() -> bool:
"""If the current Python process is running in a Google Colab.
Returns:
`True` if the current Python process is running in a Google Colab,
`False` otherwise.
"""
try:
import google.colab # noqa
return True
except ModuleNotFoundError:
return False
@staticmethod
def in_notebook() -> bool:
"""If the current Python process is running in a notebook.
Returns:
`True` if the current Python process is running in a notebook,
`False` otherwise.
"""
if Environment.in_google_colab():
return True
try:
ipython = get_ipython() # type: ignore[name-defined]
except NameError:
return False
if ipython.__class__.__name__ in [
"TerminalInteractiveShell",
"ZMQInteractiveShell",
"DatabricksShell",
]:
return True
return False
@staticmethod
def in_github_codespaces() -> bool:
"""If the current Python process is running in GitHub Codespaces.
Returns:
`True` if the current Python process is running in GitHub Codespaces,
`False` otherwise.
"""
return (
"CODESPACES" in os.environ
or "GITHUB_CODESPACE_TOKEN" in os.environ
or "GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN" in os.environ
)
@staticmethod
def in_vscode_remote_container() -> bool:
"""If the current Python process is running in a VS Code Remote Container.
Returns:
`True` if the current Python process is running in a VS Code Remote Container,
`False` otherwise.
"""
return (
"REMOTE_CONTAINERS" in os.environ
or "VSCODE_REMOTE_CONTAINERS_SESSION" in os.environ
)
@staticmethod
def in_paperspace_gradient() -> bool:
"""If the current Python process is running in Paperspace Gradient.
Returns:
`True` if the current Python process is running in Paperspace
Gradient, `False` otherwise.
"""
return "PAPERSPACE_NOTEBOOK_REPO_ID" in os.environ
@staticmethod
def in_github_actions() -> bool:
"""If the current Python process is running in GitHub Actions.
Returns:
`True` if the current Python process is running in GitHub
Actions, `False` otherwise.
"""
return "GITHUB_ACTIONS" in os.environ
@staticmethod
def in_gitlab_ci() -> bool:
"""If the current Python process is running in GitLab CI.
Returns:
`True` if the current Python process is running in GitLab
CI, `False` otherwise.
"""
return "GITLAB_CI" in os.environ
@staticmethod
def in_circle_ci() -> bool:
"""If the current Python process is running in Circle CI.
Returns:
`True` if the current Python process is running in Circle
CI, `False` otherwise.
"""
return "CIRCLECI" in os.environ
@staticmethod
def in_bitbucket_ci() -> bool:
"""If the current Python process is running in Bitbucket CI.
Returns:
`True` if the current Python process is running in Bitbucket
CI, `False` otherwise.
"""
return "BITBUCKET_BUILD_NUMBER" in os.environ
@staticmethod
def in_ci() -> bool:
"""If the current Python process is running in any CI.
Returns:
`True` if the current Python process is running in any
CI, `False` otherwise.
"""
return "CI" in os.environ
@staticmethod
def in_wsl() -> bool:
"""If the current process is running in Windows Subsystem for Linux.
source: https://www.scivision.dev/python-detect-wsl/
Returns:
`True` if the current process is running in WSL, `False` otherwise.
"""
return "microsoft-standard" in platform.uname().release
@staticmethod
def in_lightning_ai_studio() -> bool:
"""If the current Python process is running in Lightning.ai studios.
Returns:
`True` if the current Python process is running in Lightning.ai studios,
`False` otherwise.
"""
return (
"LIGHTNING_CLOUD_URL" in os.environ
and "LIGHTNING_CLOUDSPACE_HOST" in os.environ
)
__init__(self)
special
Initializes an Environment instance.
Note: Environment is a singleton class, which means this method will
only get called once. All following Environment()
calls will return
the previously initialized instance.
Source code in zenml/environment.py
def __init__(self) -> None:
"""Initializes an Environment instance.
Note: Environment is a singleton class, which means this method will
only get called once. All following `Environment()` calls will return
the previously initialized instance.
"""
get_system_info()
staticmethod
Information about the operating system.
Returns:
Type | Description |
---|---|
Dict[str, str] |
A dictionary containing information about the operating system. |
Source code in zenml/environment.py
@staticmethod
def get_system_info() -> Dict[str, str]:
"""Information about the operating system.
Returns:
A dictionary containing information about the operating system.
"""
system = platform.system()
if system == "Windows":
release, version, csd, ptype = platform.win32_ver()
return {
"os": "windows",
"windows_version_release": release,
"windows_version": version,
"windows_version_service_pack": csd,
"windows_version_os_type": ptype,
}
if system == "Darwin":
return {"os": "mac", "mac_version": platform.mac_ver()[0]}
if system == "Linux":
return {
"os": "linux",
"linux_distro": distro.id(),
"linux_distro_like": distro.like(),
"linux_distro_version": distro.version(),
}
# We don't collect data for any other system.
return {"os": "unknown"}
in_bitbucket_ci()
staticmethod
If the current Python process is running in Bitbucket CI.
Returns:
Type | Description |
---|---|
bool |
|
Source code in zenml/environment.py
@staticmethod
def in_bitbucket_ci() -> bool:
"""If the current Python process is running in Bitbucket CI.
Returns:
`True` if the current Python process is running in Bitbucket
CI, `False` otherwise.
"""
return "BITBUCKET_BUILD_NUMBER" in os.environ
in_ci()
staticmethod
If the current Python process is running in any CI.
Returns:
Type | Description |
---|---|
bool |
|
Source code in zenml/environment.py
@staticmethod
def in_ci() -> bool:
"""If the current Python process is running in any CI.
Returns:
`True` if the current Python process is running in any
CI, `False` otherwise.
"""
return "CI" in os.environ
in_circle_ci()
staticmethod
If the current Python process is running in Circle CI.
Returns:
Type | Description |
---|---|
bool |
|
Source code in zenml/environment.py
@staticmethod
def in_circle_ci() -> bool:
"""If the current Python process is running in Circle CI.
Returns:
`True` if the current Python process is running in Circle
CI, `False` otherwise.
"""
return "CIRCLECI" in os.environ
in_container()
staticmethod
If the current python process is running in a container.
Returns:
Type | Description |
---|---|
bool |
|
Source code in zenml/environment.py
@staticmethod
def in_container() -> bool:
"""If the current python process is running in a container.
Returns:
`True` if the current python process is running in a
container, `False` otherwise.
"""
# TODO [ENG-167]: Make this more reliable and add test.
return INSIDE_ZENML_CONTAINER
in_docker()
staticmethod
If the current python process is running in a docker container.
Returns:
Type | Description |
---|---|
bool |
|
Source code in zenml/environment.py
@staticmethod
def in_docker() -> bool:
"""If the current python process is running in a docker container.
Returns:
`True` if the current python process is running in a docker
container, `False` otherwise.
"""
if os.path.exists("./dockerenv") or os.path.exists("/.dockerinit"):
return True
try:
with open("/proc/1/cgroup", "rt") as ifh:
info = ifh.read()
return "docker" in info
except (FileNotFoundError, Exception):
return False
in_github_actions()
staticmethod
If the current Python process is running in GitHub Actions.
Returns:
Type | Description |
---|---|
bool |
|
Source code in zenml/environment.py
@staticmethod
def in_github_actions() -> bool:
"""If the current Python process is running in GitHub Actions.
Returns:
`True` if the current Python process is running in GitHub
Actions, `False` otherwise.
"""
return "GITHUB_ACTIONS" in os.environ
in_github_codespaces()
staticmethod
If the current Python process is running in GitHub Codespaces.
Returns:
Type | Description |
---|---|
bool |
|
Source code in zenml/environment.py
@staticmethod
def in_github_codespaces() -> bool:
"""If the current Python process is running in GitHub Codespaces.
Returns:
`True` if the current Python process is running in GitHub Codespaces,
`False` otherwise.
"""
return (
"CODESPACES" in os.environ
or "GITHUB_CODESPACE_TOKEN" in os.environ
or "GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN" in os.environ
)
in_gitlab_ci()
staticmethod
If the current Python process is running in GitLab CI.
Returns:
Type | Description |
---|---|
bool |
|
Source code in zenml/environment.py
@staticmethod
def in_gitlab_ci() -> bool:
"""If the current Python process is running in GitLab CI.
Returns:
`True` if the current Python process is running in GitLab
CI, `False` otherwise.
"""
return "GITLAB_CI" in os.environ
in_google_colab()
staticmethod
If the current Python process is running in a Google Colab.
Returns:
Type | Description |
---|---|
bool |
|
Source code in zenml/environment.py
@staticmethod
def in_google_colab() -> bool:
"""If the current Python process is running in a Google Colab.
Returns:
`True` if the current Python process is running in a Google Colab,
`False` otherwise.
"""
try:
import google.colab # noqa
return True
except ModuleNotFoundError:
return False
in_kubernetes()
staticmethod
If the current python process is running in a kubernetes pod.
Returns:
Type | Description |
---|---|
bool |
|
Source code in zenml/environment.py
@staticmethod
def in_kubernetes() -> bool:
"""If the current python process is running in a kubernetes pod.
Returns:
`True` if the current python process is running in a kubernetes
pod, `False` otherwise.
"""
if "KUBERNETES_SERVICE_HOST" in os.environ:
return True
try:
with open("/proc/1/cgroup", "rt") as ifh:
info = ifh.read()
return "kubepod" in info
except (FileNotFoundError, Exception):
return False
in_lightning_ai_studio()
staticmethod
If the current Python process is running in Lightning.ai studios.
Returns:
Type | Description |
---|---|
bool |
|
Source code in zenml/environment.py
@staticmethod
def in_lightning_ai_studio() -> bool:
"""If the current Python process is running in Lightning.ai studios.
Returns:
`True` if the current Python process is running in Lightning.ai studios,
`False` otherwise.
"""
return (
"LIGHTNING_CLOUD_URL" in os.environ
and "LIGHTNING_CLOUDSPACE_HOST" in os.environ
)
in_notebook()
staticmethod
If the current Python process is running in a notebook.
Returns:
Type | Description |
---|---|
bool |
|
Source code in zenml/environment.py
@staticmethod
def in_notebook() -> bool:
"""If the current Python process is running in a notebook.
Returns:
`True` if the current Python process is running in a notebook,
`False` otherwise.
"""
if Environment.in_google_colab():
return True
try:
ipython = get_ipython() # type: ignore[name-defined]
except NameError:
return False
if ipython.__class__.__name__ in [
"TerminalInteractiveShell",
"ZMQInteractiveShell",
"DatabricksShell",
]:
return True
return False
in_paperspace_gradient()
staticmethod
If the current Python process is running in Paperspace Gradient.
Returns:
Type | Description |
---|---|
bool |
|
Source code in zenml/environment.py
@staticmethod
def in_paperspace_gradient() -> bool:
"""If the current Python process is running in Paperspace Gradient.
Returns:
`True` if the current Python process is running in Paperspace
Gradient, `False` otherwise.
"""
return "PAPERSPACE_NOTEBOOK_REPO_ID" in os.environ
in_vscode_remote_container()
staticmethod
If the current Python process is running in a VS Code Remote Container.
Returns:
Type | Description |
---|---|
bool |
|
Source code in zenml/environment.py
@staticmethod
def in_vscode_remote_container() -> bool:
"""If the current Python process is running in a VS Code Remote Container.
Returns:
`True` if the current Python process is running in a VS Code Remote Container,
`False` otherwise.
"""
return (
"REMOTE_CONTAINERS" in os.environ
or "VSCODE_REMOTE_CONTAINERS_SESSION" in os.environ
)
in_wsl()
staticmethod
If the current process is running in Windows Subsystem for Linux.
source: https://www.scivision.dev/python-detect-wsl/
Returns:
Type | Description |
---|---|
bool |
|
Source code in zenml/environment.py
@staticmethod
def in_wsl() -> bool:
"""If the current process is running in Windows Subsystem for Linux.
source: https://www.scivision.dev/python-detect-wsl/
Returns:
`True` if the current process is running in WSL, `False` otherwise.
"""
return "microsoft-standard" in platform.uname().release
python_version()
staticmethod
Returns the python version of the running interpreter.
Returns:
Type | Description |
---|---|
str |
the python version |
Source code in zenml/environment.py
@staticmethod
def python_version() -> str:
"""Returns the python version of the running interpreter.
Returns:
str: the python version
"""
return platform.python_version()
get_environment()
Returns a string representing the execution environment of the pipeline.
Returns:
Type | Description |
---|---|
str |
the execution environment |
Source code in zenml/environment.py
def get_environment() -> str:
"""Returns a string representing the execution environment of the pipeline.
Returns:
str: the execution environment
"""
# Order is important here
if Environment.in_kubernetes():
return EnvironmentType.KUBERNETES
elif Environment.in_github_actions():
return EnvironmentType.GITHUB_ACTION
elif Environment.in_gitlab_ci():
return EnvironmentType.GITLAB_CI
elif Environment.in_circle_ci():
return EnvironmentType.CIRCLE_CI
elif Environment.in_bitbucket_ci():
return EnvironmentType.BITBUCKET_CI
elif Environment.in_ci():
return EnvironmentType.GENERIC_CI
elif Environment.in_github_codespaces():
return EnvironmentType.GITHUB_CODESPACES
elif Environment.in_vscode_remote_container():
return EnvironmentType.VSCODE_REMOTE_CONTAINER
elif Environment.in_lightning_ai_studio():
return EnvironmentType.LIGHTNING_AI_STUDIO
elif Environment.in_docker():
return EnvironmentType.DOCKER
elif Environment.in_container():
return EnvironmentType.CONTAINER
elif Environment.in_google_colab():
return EnvironmentType.COLAB
elif Environment.in_paperspace_gradient():
return EnvironmentType.PAPERSPACE
elif Environment.in_notebook():
return EnvironmentType.NOTEBOOK
elif Environment.in_wsl():
return EnvironmentType.WSL
else:
return EnvironmentType.NATIVE
get_run_environment_dict()
Returns a dictionary of the current run environment.
Everything that is returned here will be saved in the DB as
pipeline_run.client_environment
and
pipeline_run.orchestrator_environment
for client and orchestrator
respectively.
Returns:
Type | Description |
---|---|
Dict[str, str] |
A dictionary of the current run environment. |
Source code in zenml/environment.py
def get_run_environment_dict() -> Dict[str, str]:
"""Returns a dictionary of the current run environment.
Everything that is returned here will be saved in the DB as
`pipeline_run.client_environment` and
`pipeline_run.orchestrator_environment` for client and orchestrator
respectively.
Returns:
A dictionary of the current run environment.
"""
return {
"environment": get_environment(),
**Environment.get_system_info(),
"python_version": Environment.python_version(),
}
get_system_details()
Returns OS, python and ZenML information.
Returns:
Type | Description |
---|---|
str |
OS, python and ZenML information |
Source code in zenml/environment.py
def get_system_details() -> str:
"""Returns OS, python and ZenML information.
Returns:
str: OS, python and ZenML information
"""
from zenml.integrations.registry import integration_registry
info = {
"ZenML version": __version__,
"Install path": Path(__file__).resolve().parent,
"Python version": Environment.python_version(),
"Platform information": Environment.get_system_info(),
"Environment": get_environment(),
"Integrations": integration_registry.get_installed_integrations(),
}
return "\n".join(
"{:>10} {}".format(k + ":", str(v).replace("\n", " "))
for k, v in info.items()
)