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 gym, pybullet_envs, etc). 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/MsPacman-v5, or CartPoleContinuousBulletEnv-v0. Alternatively, the gym.Env subclass to use. Returns: The actual gym environment object. Raises: gym.error.Error: If the env cannot be constructed. """ # Allow for PyBullet or envs to be used as well (via string). This allows # for doing things like `env=CartPoleContinuousBulletEnv-v0`. try: import pybullet_envs pybullet_envs.getList() except (AttributeError, ModuleNotFoundError, ImportError): pass # 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