近来在跑gym上的环境时,遇到了如下的问题:

pyglet.canvas.xlib.NoSuchDisplayException: Cannot connect to "None"

习惯性地Google搜索一波解决方案,结果发现关于此类问题的导火索,主要指向 gym中的 render() 函数在远端被调用。因为该函数要求是在local本地端运行,它在本地会开启一个窗口用于渲染环境的图像。问题定位出来了,那就思考一波解决方案,首先local本地端运行这个是做不到的,毕竟疫情影响,每天战战兢兢地用远程服务器的资源跑代码,我自己的小笔记本,算力实在是跟不上。于是乎,继续查找解决方案,本着既然世界上有那么多人搞 Reinforcement Learning,很多科研工作者都是连服务器跑Atari实验的想法,那么这样的问题,就应该会有解决方案。果不其然,搜到一篇英文博客,给了些解决思路: Extending OpenAI Gym environments with Wrappers and Monitors [Tutorial]。

关于博客的内容,主要是介绍 gym中的 Wrapper 还有 Monitor组件,这些组件的用法具体详情可以看下博客。此处针对我遇到的问题,有一个思路,就是既然需要在本地端开启一个窗口,那么是否可以尝试用虚拟形式的图像渲染方式在server端启动虚拟化的图形渲染。非常好的一点是,在Linux 下就有那么一个名为 xvfb的包,就可以做这件事情。它可以在服务器上启动虚拟的图形显示,并强制程序在其中绘制。xvfb 的安装方式:

sudo apt install xvbf

调用方法:

xvfb-run -s "-screen 0 640x480x24" python xxx.py

其中在调用的过程中,还遇到了另一个问题:AttributeError: 'ImageData' object has no attribute 'data',在网上看大家的反馈,是 pyglet 的版本原因,需要指定安装特定版本的 pyglet:

pip install pyglet==1.3.2

安装完成后,继续执行程序,顺利运行,至此,踩坑结束。

  • 参考博客:

    How to run OpenAI Gym .render() over a server

    Extending OpenAI Gym environments with Wrappers and Monitors [Tutorial]

gym中render()函数在远端server运行的解决方案相关推荐

  1. 「后端小伙伴来学前端了」Vue脚手架中 render 函数

    前言 上一篇文章写了:「后端小伙伴来学前端了」分析Vue脚手架结构 简单说明了Vue的脚手架结构,但是上篇文章还欠了个小点没有说完,就在这篇文章中补齐.就是所谓的render函数. 一.main.js ...

  2. vue中render函数的作用及解析

    在vue脚手架的main.js文件中,存在这样一段代码: 意思是对vue实例的配置,其中render函数的作用是,将h创建的Node节点信息return返回给Vue.js底层处理文件中的beforeM ...

  3. iview 中 render函数与renderHeader函数

    {// 采用 renderHeader 函数时,title就不需要了// title: this.$route.query.type === '1' ? '退款编号' : ' ',key: 'refu ...

  4. 在iview中render函数使用Switch功能

    在使用iview开发过程中,遇到在table中加入switch的一个功能,在一番折腾之后,终于弄出来啦,啥也不多说直接上代码 render:(h,params)=>{return h('i-sw ...

  5. mysql raiserror_sql server数据库中raiserror函数用法的详细介绍

    sql server数据库中raiserror函数的用法 server数据库中raiserror的作用就和asp.NET中的throw new Exception一样,用于抛出一个异常或错误.这个错误 ...

  6. 调用其他命名空间中的函数-洋葱先生-杨少通

    调用其他命名空间中的函数,方法如下: 运行命名空间test2下的Main1(),即运行窗体_2_11 namespace test2 { static class Program2{[STAThrea ...

  7. matlab中push,如何在GUI中pushbutton的回调函数中嵌入函数

    在pushbutton的回调函数中加入函数后程序无法运行,具体情况如下: 程序代码: function varargout = just_try(varargin) % JUST_TRY MATLAB ...

  8. vue iframe 中写script_vue: 单文件组件 render函数

    使用vue-cli创建的vue项目,如何在这种项目中使用组建? 首先创建项目.启动项目 我们再来了解一下目录结构,src文件夹是写逻辑代码的地方,public是最终渲染到浏览器的地方. 在public ...

  9. SQL Server中自定义函数和游标应用的经典案例

    2019独角兽企业重金招聘Python工程师标准>>> SQL Server中自定义函数和游标应用的经典案例 转载于:https://my.oschina.net/zhddzr/bl ...

最新文章

  1. [转]如果我有jQuery背景,我应该如何切换到AngularJS的思维模式?
  2. CentOS7下Django安装
  3. linux cpu占用100原因查询,如何根据查询异常时间节点和连接进而确定CPU使用率100%的原因...
  4. “与中国同创”支持中国成为创新的第一现场
  5. SpringBoot异常处理的简单理解
  6. hadoop spark端口整理
  7. goudp文件传输服务器,golang udp服务端客户端例子
  8. 联想平板刷机机器人_消费终端年出货量破1.2亿,杨元庆:联想是智能化转型的赋能者...
  9. C#托管代码调用C++非托管代码
  10. 【janino】CompileException Closing single quote missing
  11. 检查eth是否到账_花费32个ETH参与以太坊2.0是件很难的事吗?
  12. python伪装浏览器https_Python3 伪装浏览器的方法示例
  13. 网评计算机学校好,网评十大最痛苦专业:计算机、数学上榜
  14. 8.1.CentOS7安装Spark安装部署及standalone模式介绍
  15. 解决Windows11能登录QQ微信,但不可以使用浏览器上网
  16. latex公式符号大全
  17. cdn/github_cdn加速配置
  18. 互联网日报 | 5月18日 星期二 | 中国移动启动A股上市;京东物流启动全球招股;快手发布首款自研手游产品...
  19. 多伦多大学好吗_多伦多大学留学好不好
  20. RK3568替换开机logo界面

热门文章

  1. 传说中的数据结构_JAVA
  2. opencv 正脸和侧脸检测
  3. Java泛型:类型擦除
  4. android适配器Adapter
  5. 深入理解多线程(三)—— Java的对象头
  6. JVM(3):Java GC算法 垃圾收集器
  7. 你不知道的JavaScript错误和调用栈常识
  8. Effective Java读书笔记三:创建和销毁对象
  9. jQuery学习笔记--JqGrid相关操作 方法列表 备忘 重点讲解(超重要)
  10. Spring(一)——总体介绍