【问题标题】:OpenAI gym render OSErrorOpenAI 健身房渲染 OSError
【发布时间】:2019-10-16 22:25:45
【问题描述】:

我正在尝试使用 OpenAI 的健身房模块来学习 Q-Learning。但是当我尝试渲染我的环境时,我收到以下错误,

OSError                                   Traceback (most recent call last)
<ipython-input-1-c269c1129a2f> in <module>
     12     action = 2
     13     new_state, reward, done, _ = env.step(action)
---> 14     plt.imshow(env.render(mode='rgb_array'))
     15     disp
     16 

C:\Program Files\Python37\lib\site-packages\gym\core.py in render(self, mode, **kwargs)
    228 
    229     def render(self, mode='human', **kwargs):
--> 230         return self.env.render(mode, **kwargs)
    231 
    232     def close(self):

C:\Program Files\Python37\lib\site-packages\gym\envs\classic_control\mountain_car.py in render(self, mode)
    116         self.cartrans.set_rotation(math.cos(3 * pos))
    117 
--> 118         return self.viewer.render(return_rgb_array = mode=='rgb_array')
    119 
    120     def get_keys_to_action(self):

C:\Program Files\Python37\lib\site-packages\gym\envs\classic_control\rendering.py in render(self, return_rgb_array)
    112             arr = arr.reshape(buffer.height, buffer.width, 4)
    113             arr = arr[::-1,:,0:3]
--> 114         self.window.flip()
    115         self.onetime_geoms = []
    116         return arr if return_rgb_array else self.isopen

C:\Program Files\Python37\lib\site-packages\pyglet\window\win32\__init__.py in flip(self)
    319     def flip(self):
    320         self.draw_mouse_cursor()
--> 321         self.context.flip()
    322 
    323     def set_location(self, x, y):

C:\Program Files\Python37\lib\site-packages\pyglet\gl\win32.py in flip(self)
    224 
    225     def flip(self):
--> 226         _gdi32.SwapBuffers(self.canvas.hdc)
    227 
    228     def get_vsync(self):

OSError: exception: access violation reading 0x000000000000001C

当我从命令提示符运行我的代码时,我得到了同样的错误

另外,这是我的代码,

import matplotlib.pyplot as plt
import gym
from IPython import display
%matplotlib inline

env = gym.make("MountainCar-v0")
env.reset()

done = False

while not done:
    action = 2
    new_state, reward, done, _ = env.step(action)
    plt.imshow(env.render(mode='rgb_array'))
    display.display(plt.gcf())
    display.clear_output(wait=True)

env.close()

我无法通过健身房在互联网上找到此错误,因此无法解决。 我什至尝试了 cartpole 环境,但以同样的错误结束。

感谢任何帮助。

【问题讨论】:

    标签: python python-3.x pyglet openai-gym q-learning


    【解决方案1】:

    这可能是由于动态使用ipython-display。 将您的代码更改为:

    import matplotlib.pyplot as plt
    import gym
    #from IPython import display
    #%matplotlib inline
    
    env = gym.make("MountainCar-v0")
    env.reset()
    
    done = False
    
    while not done:
        action = 2
        new_state, reward, done, _ = env.step(action)
        #plt.imshow(env.render(mode='rgb_array'))
        env.render(mode='rgb_array')
        #display.display(plt.gcf())
        #display.clear_output(wait=True)
    
    env.close()
    

    此 OSError 的发生可能有多种原因,因此如果不验证所有内容,就很难重现和调试。但是从你的这个错误来看:

    C:\Program Files\Python37\lib\site-packages\pyglet\gl\win32.py in flip(self)
        224 
        225     def flip(self):
    --> 226         _gdi32.SwapBuffers(self.canvas.hdc)
        227 
        228     def get_vsync(self):
    

    由于 GDI 和 ICD 共享函数名称,如 SwapBuffers,因此 加载 proc 时需要 wglSwapBuffers 以避免歧义 动态地,您的一个显示器可能lock 另一个显示器。 我不确定,但这似乎比其他任何原因都更有可能。

    【讨论】:

    • 感谢您的回答,但我仍然从 _gdi32 收到相同的内存访问错误。它发生在env.render()
    • 您能否从头开始重新安装pyglet 并运行here 中的任何代码
    • 很抱歉,我花了这么长时间才回复这个问题,但我一直在尝试有关 pyglet 错误的所有内容,包括但不限于运行 chkdsk、sfc 扫描以及重新安装 python 和 pyglet。他们似乎都没有解决我的问题
    • 您能否使用您正在使用的matplotlib, gym, pyglet versions 的所有版本来编辑您的问题,这样我可以更轻松地重现该错误,也适用于所有看到它的人...
    猜你喜欢
    • 1970-01-01
    • 2022-10-08
    • 2018-10-10
    • 2019-02-05
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多