在Windows10上安装Malmo平台

Author:@Sumsky

前言

这里记录的是作者在自己的笔记本电脑上安装Malmo平台的经历和体会,包括中间遇到的问题和解决方式,都一并分享给读者。需要注意的是,读者按照下文指引安装时并不一定会遇到作者的问题,当然也有可能遇到一些作者没遇到的问题;因此本篇不一定能帮助所有人完成安装,但是读者仍可从中批判性地学习吸收有用的经验。
关于安装环境: 作者的电脑操作系统为win10家庭版, 版本号20H2,内部版本19042.546。

一点提醒

由于安装过程中多次涉及到从境外平台下载文件,所以作者强烈推荐在安装的全过程中使用一些手段和工具以保持稳定可靠的国际互联网连接。作者并未验证在不使用特定手段和工具的情况下是否能够安装成功,而不会出现安装速度延迟甚至超时中断的情况。
作者本人在安装过程中使用校园网,并全程开启相关工具,其中有一段时间还打开了全局代理模式,并有可能借此解决了遇到的一个问题。

Step1 访问Malmo项目Github主页

  • Malmo项目在GitHub的链接为 https://github.com/microsoft/malmo;
  • 在这个Github的仓库中,微软提供了英文版的安装指导,以及指向项目文档的链接。此外仓库的600多个Issues里还记录了众多Github用户在安装和使用Malmo中遇到的问题和解决方案,或许你在安装中遇到的问题就可能已经被人碰到过并提出来了:)
  • 当然,作者本人也是根据Github上的说明(具体而言,主要是按照Readme.md中“Malmo as a native Python wheel”部分)一步步安装的,因此如果下文叙述中有任何谬误,也请以仓库中微软官方的文档为准。
    0rXm5D.png

Step2 下载并解压Malmo发行版

  • 点击Github项目主页右侧的“Release”,或直接访问链接 https://github.com/microsoft/malmo/releases/tag/0.37.0;
  • 选择文件名为 “Malmo-0.37.0-Windows-64bit_withBoost_Python3.7.zip” 的版本(如果你的python版本是3.6也可以下载3.6对应的那个),点击下载;
  • 下载完成后,解压至你想要安装的目录。请记住这个目录,因为它以后可能会多次被用到。 这里我以我自己安装的目录举例:解压到E:\Malmo。解压后的目录结构如下图所示:

0rX1KI.png

Step3 安装依赖项

Malmo平台想要在windows以及其它系统上运行都需要一些其它软件的支持。这一部分分为自动安装和手动安装两种方式。作者曾尝试使用微软提供的脚本自动安装,但是没有成功,后改用手动安装。

部分常用语解释
安装目录 -> 上一步中解压发行版的根目录,在作者的电脑上是E:\Malmo
在xxx目录打开命令行 -> 首先进入对应的xxx目录,点击左上角文件->打开Windows Powershell->以管理员身份打开Windows Powershell。当然也可以在cmd中使用cd命令进到对应的目录里。

自动安装

参考文档: https://github.com/microsoft/malmo/blob/0.37.0/doc/install_windows.md

  • 打开安装目录下的scripts文件夹,并在这个目录下打开命令行;
  • 执行 Set-ExecutionPolicy -Scope CurrentUser Unrestricted,如果出现提示选yes;
  • 运行安装脚本,即执行 .\malmo_install.ps1
  • 等待脚本执行结束,可能需要一些时间。如果长时间卡壳或者报错,请尝试重新运行,或者手动安装(见下)。

手动安装1:7-Zip

手动安装参考文档:https://github.com/Microsoft/malmo/blob/master/doc/install_windows_manual.md

  • 访问https://www.7-zip.org/,首页选择合适版本,下载并运行安装程序;
  • 验证方式:在控制面板“卸载程序”的程序列表中查看是否出现7-Zip;

0rXJVf.png

手动安装2:FFMpeg

手动安装3:Python

  • 这个读者肯定都已经安装,就不赘言了。注意需要将python的安装路径添加到系统环境变量中,即确保在cmd中输入python有响应;

手动安装4:OpenJDK

  • 这里作者由于曾经自学过一点Java,所以已经在自己的电脑上配置好了Java的开发环境,包括从Oracle网站下载的JDK8和对应的JRE,所以就不需要再下载安装OpenJDK了。有相同情况的同学也可以跳过这一步。
  • 尽管曾经用过的Logisim和MARS也要求有Java的运行环境,不过作者无法确定这个环境是否满足Malmo的运行要求。鉴于此,推荐读者安装并配置完整的Java开发环境,既能满足当前要求,又可以方便将来升学或工作中的使用。
  • 作者在此不会详细介绍配置Java开发环境的步骤,因为在上学期1806的OO课程中,已有助教撰写了一份详细的文档指导隔壁计算机专业的同学。文档名为 “OO工具链教程.pdf” ,作者已经将其上传到班级公共网盘的文件夹,读者可以直接登录北航网盘的“180621”共享文件夹查看,或者通过https://bhpan.buaa.edu.cn:443/link/51D8179EA8FED500E283D02688A53D4E (有效期限:2020-11-07 23:59) 下载。对于我们要安装的Malmo,只需要关注该文档的“JDK安装配置指南”部分即可。
  • 当然,如果读者仅仅想要安装Malmo参考文档中要求的OpenJDK,也可自行通过搜索引擎了解安装步骤,并确保已经配置好JAVA_HOME等环境变量。
  • 验证方式:在cmd中输入java观察是否有响应;以及检查环境变量是否配置到位(见下图,JAVA_HOME没必要保持一致):
    0rXWRJ.png

手动安装5:设置MALMO_XSD_PATH环境变量

  • 在设置环境变量的窗口,新建一个系统环境变量,变量名为MALMO_XSD_PATH
  • 变量值设定为Malmo安装目录下的Schemas文件夹,以作者的电脑为例,设置为E:\Malmo\Schemas
  • 验证方式:检查环境变量是否配置到位(见下图):
    0rX4MR.png

Step4 首次运行Minecraft终端

需要注意的是,今后每次运行python代码前,也需要遵循下面的步骤首先打开minecraft终端界面。 每次运行时系统都会检查MC运行所需的文件是否下载齐全,因此首次运行需要比较长的时间,而后续就比较短了。作者在自己的电脑上安装成功后,每次运行MC基本可以在1.5min内完成;

  • 进入安装目录下的Minecraft文件夹,在作者的电脑上是E:\Malmo\Minecraft

  • 在该目录下打开命令行,执行 .\launchClient

  • Wait for a looooooooooooooong time… until Minecraft window appears;

  • 作者在这里执行了两次脚本才完成安装,首次执行时由于无法下载其中的一些文件导致卡壳;随后作者采取的解决方案是关闭命令行,将保证国际互联网连接的工具切换为全局模式,重新执行脚本,就成功启动MC了。整个过程用时相当长,两次执行前前后后大概得有至少半个多小时,因此大家不妨保持耐心;

0rXHIO.png

Step5 运行示例程序

  • 可以点击左下方的“地球图标”修改游戏的语言(虽然用处不大)
  • 在上图所示的Minecraft终端界面上进行如下操作:点击mods选项卡 -> 左侧选中"Microsoft Malmo Mod",点击下面的Config -> 将"debugDisplayLevel"切换到"Show all diagnostics" -> 点击下面的完成,返回主界面。
  • 关注主界面上的两个信息:
    • 左上方的"CLIENT: …“指示当前MC终端的状态,正常情况应当是"DORMANT”;
    • 右下方的"MCP"指示平台与终端通讯的端口,在[10000, 11000]中取值,记住该端口;
  • 现在可以进入Python_examples目录,开启另一个终端并使用python命令运行程序了,注意需要保持Minecraft终端界面和之前执行.\launchClient的命令行界面不能关闭;也可以直接在编辑器(如vscode)中运行;
  • 需要注意的是,作者在自己的电脑上只能使用python命令才能成功运行程序,如果使用我们之前在虚拟机上的python3命令,结果是没有反应:程序在没有任何输出的情况下直接终止,MC的终端也没有任何动作;
  • 作者在此遇到的其他问题包括:

    命令行输出错误信息:
    import MalmoPython
    ImportError: DLL load failed: The specified module could not be found.

    • 这个问题在GitHub的Issue中被提出过很多次,一般的引发原因是:微软在Github上开放的源代码中包含了一个名为zlib.dll的文件,但是这个文件不知道什么原因并未在发行版中提供。解决方案也很简单:访问https://cn.dll-files.com/zlib.dll.html,下载一个对应版本的文件,将其拷贝到Python_examples目录中即可,或者如果读者的电脑上有同名文件也可以直接拷贝。

    命令行输出错误信息:
    malmo Error starting mission: Failed to find an available client for this mission- tried all the clients in the supplied client pool.

    • 根据提示,程序没有找到可以与MC终端通信的端口。这里需要关注一下之前提到的MC主界面右下角的MCP值与程序中设定的端口是否一致。程序中往往使用my_client_pool.add()设置通信端口,如果没有相关语句,那么默认使用端口10000. 如果二者不一致,就会出现上面的错误信息。解决方案是在程序中添加相关语句,将通信端口设置为MCP指定的端口。在作者的电脑中,MC终端选择了10001端口,这样一些使用默认端口的程序就无法运行,我们在程序的合适位置添加如下代码(或找到同样的代码并修改端口值):
    1
    2
    3
    # 将程序中与MC终端的通信端口设置为10001
    my_client_pool = MalmoPython.ClientPool()
    my_client_pool.add(MalmoPython.ClientInfo("127.0.0.1", 10001))
    同时修改开始任务的语句:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    '''
    五个参数都必须填写。
    参数1、3一般已经定义;
    参数2刚刚在上方定义;
    参数4用于区别同一个mission中的不同agent,单agent情况下可填0;
    参数5用于标识当前任务,可设置为任意字符串;
    参数说明参考https://microsoft.github.io/malmo/0.30.0/Documentation/classmalmo_1_1_agent_host.html#ada45e62f1d53c9946631d49ecef9fce9
    '''
    agent_host.startMission( my_mission, my_client_pool, my_mission_record, 0, "tutorial_1" )
  • 当你可以正常运行Python_examples中的程序并在Minecraft终端里看到结果时,也就意味着Malmo平台已经在你的win10上安装成功了。Enjoy it!

参考资料