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