try: from collections.abc import Iterable except ImportError: Iterable = (tuple, list) from gym.vector.async_vector_env import AsyncVectorEnv from gym.vector.sync_vector_env import SyncVectorEnv from gym.vector.vector_env import VectorEnv, VectorEnvWrapper __all__ = ["AsyncVectorEnv", "SyncVectorEnv", "VectorEnv", "VectorEnvWrapper", "make"] def make(id, num_envs=1, asynchronous=True, wrappers=None, **kwargs): """Create a vectorized environment from multiple copies of an environment, from its id Parameters ---------- id : str The environment ID. This must be a valid ID from the registry. num_envs : int Number of copies of the environment. asynchronous : bool (default: `True`) If `True`, wraps the environments in an `AsyncVectorEnv` (which uses `multiprocessing` to run the environments in parallel). If `False`, wraps the environments in a `SyncVectorEnv`. wrappers : Callable or Iterable of Callables (default: `None`) If not `None`, then apply the wrappers to each internal environment during creation. Returns ------- env : `gym.vector.VectorEnv` instance The vectorized environment. Example ------- >>> import gym >>> env = gym.vector.make('CartPole-v1', 3) >>> env.reset() array([[-0.04456399, 0.04653909, 0.01326909, -0.02099827], [ 0.03073904, 0.00145001, -0.03088818, -0.03131252], [ 0.03468829, 0.01500225, 0.01230312, 0.01825218]], dtype=float32) """ from gym.envs import make as make_ def _make_env(): env = make_(id, **kwargs) if wrappers is not None: if callable(wrappers): env = wrappers(env) elif isinstance(wrappers, Iterable) and all( [callable(w) for w in wrappers] ): for wrapper in wrappers: env = wrapper(env) else: raise NotImplementedError return env env_fns = [_make_env for _ in range(num_envs)] return AsyncVectorEnv(env_fns) if asynchronous else SyncVectorEnv(env_fns)