让 xvfb 在 M1 上的 jupyter notebook 中工作 Mac

Getting xvfb to work in jupyter notebook on M1 Mac

我在 colab 上使用 OpenAI gym,并根据本教程使用以下代码在 Jupyter notebook 中渲染视频:https://colab.research.google.com/drive/1flu31ulJlgiRL1dnN2ir8wGh9p7Zij2t

import gym
from gym import logger as gymlogger
from gym.wrappers import Monitor
gymlogger.set_level(40) #error only
import numpy as np
import random
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
import math
import glob
import io
import base64

from IPython.display import HTML
from IPython import display as ipythondisplay, display

import tensorflow as tf
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense, ConvLSTM2D, Flatten, Conv2D
from tf_agents.agents.dqn import dqn_agent
from tf_agents.replay_buffers import tf_uniform_replay_buffer
from tf_agents.specs import tensor_spec

display = Display(visible=0, size=(1400, 900))
display.start()

def show_video():
  mp4list = glob.glob('video/*.mp4')
  if len(mp4list) > 0:
    mp4 = mp4list[0]
    video = io.open(mp4, 'r+b').read()
    encoded = base64.b64encode(video)
    ipythondisplay.display(HTML(data='''<video alt='test' autoplay 
                loop controls style='height: 400px;'>
                <source src='data:video/mp4;base64,{0}' type='video/mp4' />
             </video>'''.format(encoded.decode('ascii'))))
  else: 
    print('Could not find video')
    

def wrap_env(env):
  env = Monitor(env, './video', force=True)
  return env

env, spec = query_environment('MsPacman-v0')
env = wrap_env(env)

observation = env.reset()

while True:
    env.render()
    #your agent goes here
    action = env.action_space.sample() 
    observation, reward, done, info = env.step(action) 
    if done: 
        break;
            
env.close()
show_video()

在我的 M1 Mac 上,由于缺少 xvfb,我无法 运行 使用下面这两行设置显示。我在 M1 Mac 上的所有包都是 运行 原生的。

display = Display(visible=0, size=(1400, 900))
display.start()

我尝试安装 xvfbwrapper 然后导入 Xvfb 并替换第一行,如下所示,但错误是找不到 xvfb。我阅读并发现 xvfb 不再随 Macs 一起提供,所以我通过 Xquartz 安装了它:https://www.xquartz.org/ 但它仍然不起作用。

from xvfbwrapper import Xvfb
display = Xvfb(width=1400, height=900)

没有这些行,仍然会生成一个视频,但它在一个新的 window 中,而不是在 jupyter notebook 本身中。 (还有一个问题,我似乎无法关闭 window 一旦生成,但这是另一个问题)。

我的问题是我是否可以做任何修改以使上面的代码工作?如果没有,是否有任何其他方法可以在笔记本本身内呈现视频?

谢谢。

不确定为什么会出现这种情况,即使 xvfb 在 PATH 中,但必须再次将其专门添加到 jupyter notebook 单元格中的环境才能工作

os.environ["PATH"] += os.pathsep + '/opt/X11/bin'