Source code for ray.rllib.env.utils
import logging
from typing import Type, Union
import gymnasium as gym
from ray.rllib.env.env_context import EnvContext
from ray.rllib.utils.error import (
ERR_MSG_INVALID_ENV_DESCRIPTOR,
EnvError,
)
from ray.util.annotations import PublicAPI
logger = logging.getLogger(__name__)
[docs]
@PublicAPI
def try_import_pyspiel(error: bool = False):
"""Tries importing pyspiel and returns the module (or None).
Args:
error: Whether to raise an error if pyspiel cannot be imported.
Returns:
The pyspiel module.
Raises:
ImportError: If error=True and pyspiel is not installed.
"""
try:
import pyspiel
return pyspiel
except ImportError:
if error:
raise ImportError(
"Could not import pyspiel! Pygame is not a dependency of RLlib "
"and RLlib requires you to install pygame separately: "
"`pip install pygame`."
)
return None
[docs]
@PublicAPI
def try_import_open_spiel(error: bool = False):
"""Tries importing open_spiel and returns the module (or None).
Args:
error: Whether to raise an error if open_spiel cannot be imported.
Returns:
The open_spiel module.
Raises:
ImportError: If error=True and open_spiel is not installed.
"""
try:
import open_spiel
return open_spiel
except ImportError:
if error:
raise ImportError(
"Could not import open_spiel! open_spiel is not a dependency of RLlib "
"and RLlib requires you to install open_spiel separately: "
"`pip install open_spiel`."
)
return None
def _gym_env_creator(
env_context: EnvContext,
env_descriptor: Union[str, Type[gym.Env]],
) -> gym.Env:
"""Tries to create a gym env given an EnvContext object and descriptor.
Note: This function tries to construct the env from a string descriptor
only using possibly installed RL env packages (such as gymnasium).
These packages are no installation requirements for RLlib. In case
you would like to support more such env packages, add the necessary imports
and construction logic below.
Args:
env_context: The env context object to configure the env.
Note that this is a config dict, plus the properties:
`worker_index`, `vector_index`, and `remote`.
env_descriptor: The env descriptor as a gym-registered string, e.g.
"CartPole-v1", "ale_py:ALE/Breakout-v5".
Alternatively, the gym.Env subclass to use.
Returns:
The actual gym environment object.
Raises:
gym.error.Error: If the env cannot be constructed.
"""
# If env descriptor is a str, starting with "ale_py:ALE/", for now, register all ALE
# envs from ale_py.
if isinstance(env_descriptor, str) and env_descriptor.startswith("ale_py:ALE/"):
import ale_py
gym.register_envs(ale_py)
# Try creating a gym env. If this fails we can output a
# decent error message.
try:
# If class provided, call constructor directly.
if isinstance(env_descriptor, type):
env = env_descriptor(env_context)
else:
env = gym.make(env_descriptor, **env_context)
except gym.error.Error:
raise EnvError(ERR_MSG_INVALID_ENV_DESCRIPTOR.format(env_descriptor))
return env