AttributeError: ‘SubprocVecEnv‘ object has no attribute ‘envs‘错误的原因

IT疑难杂症诊疗室 10w+人浏览 3.3k人参与

一、问题背景

在早期版本的Stable Baselines3中,SubprocVecEnv提供了envs属性,用于访问子进程中的环境实例。然而,从某个版本开始,这个属性被移除了,主要是为了简化代码和避免潜在的线程安全问题。


二、解决方案

如果你需要访问子进程中的环境实例,可以使用get_attr和set_attr方法来获取和设置环境的属性,而不是直接访问envs。

以下是一个示例代码,展示如何使用get_attr和set_attr方法来替代直接访问envs:

import gymnasium as gym
from stable_baselines3.common.vec_env import SubprocVecEnv

# 定义一个简单的环境类
class SimpleEnv(gym.Env):
    def __init__(self):
        self.observation_space = gym.spaces.Discrete(10)
        self.action_space = gym.spaces.Discrete(2)
        self.state = 0

    def reset(self, seed=None, options=None):
        self.state = 0
        return self.state, {}

    def step(self, action):
        self.state += action
        reward = 0
        done = self.state >= 10
        return self.state, reward, done, False, {}

    def render(self):
        pass

# 创建多个环境实例
env = SubprocVecEnv([lambda: SimpleEnv() for _ in range(4)])

# 使用 get_attr 方法获取环境的属性
env_states = env.get_attr('state')
print("环境的状态:", env_states)

# 使用 set_attr 方法设置环境的属性
env.set_attr('state', 5, indices=[0, 1])
env_states = env.get_attr('state')
print("修改后的环境状态:", env_states)

# 关闭环境
env.close()

输出示例

环境的状态: [0, 0, 0, 0]
修改后的环境状态: [5, 5, 0, 0]

三、代码说明

1、定义环境类:

• SimpleEnv是一个简单的自定义环境类,继承自gym.Env。

• 在__init__方法中,定义了观察空间和动作空间,并初始化了状态state。


2、创建多环境实例:

• 使用SubprocVecEnv创建了 4 个子进程环境实例。


3、使用get_attr方法:

• env.get_attr('state')获取所有子环境中state属性的值。


4、使用set_attr方法:

• env.set_attr('state', 5, indices=[0, 1])设置指定子环境中state属性的值。


5、关闭环境:

• 使用env.close()关闭所有子进程环境实例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值