Python 仅在Jupyter笔记本中显示OpenAI健身房

Python 仅在Jupyter笔记本中显示OpenAI健身房,python,python-3.x,jupyter-notebook,reinforcement-learning,openai-gym,Python,Python 3.x,Jupyter Notebook,Reinforcement Learning,Openai Gym,我想在笔记本电脑中玩OpenAI健身房,并在线渲染健身房 以下是一个基本示例: import matplotlib.pyplot as plt import gym from IPython import display %matplotlib inline env = gym.make('CartPole-v0') env.reset() for i in range(25): plt.imshow(env.render(mode='rgb_array')) display.d

我想在笔记本电脑中玩OpenAI健身房,并在线渲染健身房

以下是一个基本示例:

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

env = gym.make('CartPole-v0')
env.reset()

for i in range(25):
   plt.imshow(env.render(mode='rgb_array'))
   display.display(plt.gcf())    
   display.clear_output(wait=True)
   env.step(env.action_space.sample()) # take a random action

env.close()
这很有效,我在笔记本上看到了健身房:

但是它还会打开一个交互窗口,显示完全相同的内容我不希望此窗口打开:


我在这里制作了一个工作示例,您可以使用它:两个在Jupyter中渲染的示例—一个是mp4,另一个是实时gif

.mp4示例非常简单

import gym
from gym import wrappers

env = gym.make('SpaceInvaders-v0')
env = wrappers.Monitor(env, "./gym-results", force=True)
env.reset()
for _ in range(1000):
    action = env.action_space.sample()
    observation, reward, done, info = env.step(action)
    if done: break
env.close()
然后在一个新的牢房里

import io
import base64
from IPython.display import HTML

video = io.open('./gym-results/openaigym.video.%s.video000000.mp4' % env.file_infix, 'r+b').read()
encoded = base64.b64encode(video)
HTML(data='''
    <video width="360" height="auto" alt="test" controls><source src="data:video/mp4;base64,{0}" type="video/mp4" /></video>'''
.format(encoded.decode('ascii')))
导入io
导入base64
从IPython.display导入HTML
video=io.open('./gym results/openaigym.video.%s.video000000.mp4'%env.file_infix,'r+b').read()
encoded=base64.b64编码(视频)
HTML(数据=“”)
'''
.format(编码的.decode('ascii'))

这对我来说在Ubuntu 18.04 LTS中很有效,可以在本地渲染gym。但是,我相信它甚至可以在远程Jupyter笔记本服务器上工作

首先,在终端中运行以下安装:

pip install gym
python -m pip install pyvirtualdisplay
pip3 install box2d
sudo apt-get install xvfb
就这样。使用以下代码段配置matplotlib的呈现方式:

import matplotlib.pyplot as plt
from pyvirtualdisplay import Display
display = Display(visible=0, size=(1400, 900))
display.start()

is_ipython = 'inline' in plt.get_backend()
if is_ipython:
    from IPython import display

plt.ion()

# Load the gym environment

import gym
import matplotlib.pyplot as plt
%matplotlib inline

env = gym.make('LunarLander-v2')
env.seed(23)

# Let's watch how an untrained agent moves around

state = env.reset()
img = plt.imshow(env.render(mode='rgb_array'))
for j in range(200):
#     action = agent.act(state)
    action = random.choice(range(4))
    img.set_data(env.render(mode='rgb_array')) 
    plt.axis('off')
    display.display(plt.gcf())
    display.clear_output(wait=True)
    state, reward, done, _ = env.step(action)
    if done:
        break 
        
env.close()

如果重新启动内核并将
%matplotlib inline
置于
env.reset()
之后,会出现相同的行为?对OpenAI gym不太熟悉,但是
env.reset()
听起来可能(潜在地)是因为导入或其他原因引起的…@MattMessersmith nope,这不会改变任何事情:-/你在macOS上?今天晚些时候我可以测试一下,看看是否可以重现这种行为。@MattMessersmith是的,在使用Python 3.6.6的macOS上这对我不起作用。您是否尝试过使用
CartPole-v0
?窗户仍然为我打开。这个问题不会发生在
SpaceInvaders-v0
上,但这不是我想要使用的环境,所以这不相关。