Ubuntu16.04 完整版 Gym 安装及说明

news2025/1/18 8:55:56

Ubuntu16.04 完整版 Gym 安装及说明

  • 1. 安装前言
  • 2. Gym 开发环境说明
  • 3. 完整版 Gym 的安装
    • 3.1 Anaconda 创建虚拟环境
    • 3.2 安装 gym[box2d]
      • 3.2.1 采用官方 GitHub 教程进行安装的报错及解决方案
      • 3.2.2 采用 Anaconda 进行安装
      • 3.2.3 测试能否成功运行 LunarLander-v2 环境
    • 3.3 安装 gym[atrai]
      • 3.3.1 采用 pip 进行安装
      • 3.3.2 测试能否成功运行 Atari 环境
    • 3.4 安装 gym[mujoco]
      • 3.4.1 官方 GitHub 下载 mujoco 2.1.0 并安装
      • 3.4.2 官方 GitHub 下载 mujoco-py 并安装
      • 3.4.3 测试能否成功运行 MuJoCo 环境

1. 安装前言

之前已经专门写过一个博客,用来记录之前在 Windows 系统下安装 MuJoCo 的经历:Win 10、Win 11 安装 MuJoCo 及 mujoco-py 教程_lan 606的博客-CSDN博客_windows安装mujoco

但其实在 Windows 系统下进行一些专业的开发还是会存在非常多的问题,加上我最近也是要频繁使用到 Linux 系统进行一些工作,索性在 Ubuntu 16.04 下重新安装。

至于我在 2022年 这个时间节点仍然选择 Ubuntu 16.04 这样一个即将被官方放弃维护的系统,主要还是因为我使用的一些工具在 Ubuntu 16.04 上的兼容性最好,但文中所述的方法理论上在所有的 Linux 发行版上都能得到一个不错的安装体验。

2. Gym 开发环境说明

Gym 全称是 OpenAI Gym,是 OpenAI 开发的一个工具包,有强化学习基础或者正在学习强化学习的同学应该知道,强化学习是智能体不断地与环境进行交互,并逐步从环境中获取奖励以指导智能体探索行为的一种方法。而开发 Gym 的目标就是使得在整个开发强化学习算法过程中,不需要额外考虑复杂的环境搭建过程,只专注于算法本身性能的提升。

具体的关于 Gym 的说明可参考官方文档:Basic Usage - Gym Documentation (gymlibrary.dev)

具体的官方 GitHub 链接如下:GitHub - openai/gym: A toolkit for developing and comparing reinforcement learning algorithms.

Gym 的环境总共有五大类环境,分别是 AtariMuJoCoToy TextClassic ControlBox2D,其中 Toy TextClassic Control 都是基础版 gym 就已经包括的环境大类,而其他三项都是需要额外进行安装的环境。

在这里插入图片描述

图1. Atari 环境

在这里插入图片描述

图2. MuJoCo 环境

在这里插入图片描述

图3. Toy Text 环境演示

在这里插入图片描述

图4. Classic Control 环境

在这里插入图片描述

图5. Box2D 环境

有一篇博客对 OpenAI Gym 的环境进行了完整的汇总,具体参见:强化学习基础篇(十)OpenAI Gym环境汇总 - 简书 (jianshu.com)

3. 完整版 Gym 的安装

3.1 Anaconda 创建虚拟环境

Anaconda 是一个开源的 Python 发行版本,其最大的优势是可以建立多个虚拟环境,且虚拟环境之间互不干扰。这样可以在多个环境间切换,应用在不同的 Python 工程中。

具体的 Anaconda 安装包可以在清华大学开源软件镜像站中下载,镜像站的网址为:Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

具体我下载的是 Anaconda3-2020.07-Linux-x86_64.sh 版本。

Terminal 中先 cd 到具体的下载地址,然后输入下面的命令行:

bash Anaconda3-2021.11-Linux-x86_64.sh

具体的安装细节可参考下述链接:Ubuntu安装Anaconda详细步骤(Ubuntu21.10,Anaconda3)_萝北村的枫子的博客-CSDN博客_ubuntu安装anaconda

安装完成之后建议重启一下系统,然后再次 Ctrl + Alt + T 打开 Terminal 之后,就会出现下述界面:

在这里插入图片描述

图6. 安装完成 Anaconda 后首次打开 Terminal

由于每次自动打开 base 环境,但实际使用并不频繁,所以可使用下述命令关闭每次自动打开的虚拟环境:

conda config --set auto_activate_base false

可使用下述命令查看本机中已经创建的 Anacoda 虚拟环境:

conda info -e

在这里插入图片描述

图7. 使用命令查看 Anaconda 已经创建的环境

上图中的 py37 虚拟环境就是本次安装完整版 Gym 所使用的虚拟环境。

若只存在一个 base 环境,可采用下述命令创建一个自己的虚拟环境:

conda create -n py37 python==3.7.0

在创建完虚拟环境之后,需采用下述命令激活,这样会在命令行开头多一个环境名:

conda activate py37

如果想让当前的虚拟环境处于失效状态,需在 Terminla 中运行下述命令:

conda deactivate

同时也可以注意到命令行开头的环境名消失不见了。

在这里插入图片描述

图8. Anaconda 环境的激活与反激活

进入到虚拟环境之后,与正常的 Python 环境一样,都可以使用 pip 命令进行库的安装。

  • 注1:上述创建 Anaconda 虚拟环境的步骤与 Windows 系统下进行虚拟环境的创建完全相同。
  • 注2:OpenAI Gym 官方 GitHub 中说明支持 Linux 和 macOS 系统上的 Python 3.7-3.10,因而不建议使用其他版本的 Python。
  • 注3:本人之前的使用过程中,从 Python 3.8 开始移除了 time.clock() 方法,这会导致 env.render() 方法失效,所以建议安装 Python 3.7。

3.2 安装 gym[box2d]

如果在上述虚拟环境中直接进行 pip install gym 命令,会直接给你安装最新的精简版 Gym,该版本的 Gym 不包含任何扩展环境,所以在该版本的 Gym 中无法使用AtariMuJoCoBox2D,只能使用基本的 Toy TextClassic Control

而在 Gym 官方文档首页展示的 'LunarLander-v2' 这一经典环境都是需要 Box2D 的。

3.2.1 采用官方 GitHub 教程进行安装的报错及解决方案

首先是安装精简版的 Gym:

pip install gym

然后,官方文档给出的方案是采用如下命令进行安装:

pip install gym[box2d]

实测通过该指令安装的 Box2D 无法正常调用 Gym 的渲染环境,会出现如下报错信息:

AttributeError: module ‘gym.envs.box2d’ has no attribute ‘LunarLander’

网上提供的教程基本都是让先安装 swig 模块,然后再安装 box2d 模块,但我多次创建虚拟环境并按这个方式完成安装之后依旧没法正常启动 LunarLander-v2 环境(只有其中一次是可以正常启动环境的,所以看脸)。

具体的一个参考博客如下(Windows端的处理教程):AttributeError: module ‘gym.envs.box2d‘ has no attribute ‘LunarLander‘_Faith_xzc的博客-CSDN博客

3.2.2 采用 Anaconda 进行安装

主要是受到这篇帖子的一个启发:尽管存在以下错误,我如何安装gym(box2d)? - 我爱学习网 (5axxw.com),通过 conda 命令进行安装。

需要注意的一点是,采用下述命令前是不需要运行精简版 gym 的 pip 安装指令的,直接运行下述命令就会匹配最佳的 0.21.0 的 gym 版本:

conda install -c conda-forge gym-box2d

在执行完上述指令后,就会在 py37 的虚拟环境下安装基础版的 gym 和运行 Box2D 类 gym 环境的 gym[box2d]

3.2.3 测试能否成功运行 LunarLander-v2 环境

前文中已经介绍过,LunarLander-v2 是 gym Box2D 类中非常重要的一个环境,通过该环境可以检测我们在 3.2.2 步骤中安装的环境是否有问题。

首先新建一个 Python 脚本,输入如下代码:

import gym
import time


env = gym.make("LunarLander-v2")
env.reset()
done = False
while not done:
    env.render()
    action = env.action_space.sample()
    observation, reward, done, info = env.step(action)
    time.sleep(0.04)
    # print(observation)
env.close()

如果前文是正确安装的话,应该能看到以下动画:

在这里插入图片描述

图9. LunarLander-v2 环境运行效果图

这里顺便给出将 gym 运行的图像保存为 gif 的代码:

from matplotlib import animation
import matplotlib.pyplot as plt
import gym


def save_frames_as_gif(frames, path='./', filename='gym_animation.gif'):
    # Mess with this to change frame size
    plt.figure(figsize=(frames[0].shape[1] / 72.0, frames[0].shape[0] / 72.0), dpi=72)

    patch = plt.imshow(frames[0])
    plt.axis('off')

    def animate(i):
        patch.set_data(frames[i])

    anim = animation.FuncAnimation(plt.gcf(), animate, frames=len(frames), interval=50)
    anim.save(path + filename, writer='imagemagick', fps=60)


# Make gym env
env = gym.make('LunarLander-v2')

# Run the env
observation = env.reset()
my_frames = []
done = False
while not done:
    my_frames.append(env.render(mode="rgb_array"))
    action = env.action_space.sample()
    observation, reward, done, info = env.step(action)
env.close()
save_frames_as_gif(my_frames, path='./', filename='LunarLander-v2.gif')

3.3 安装 gym[atrai]

3.3.1 采用 pip 进行安装

这个经本人实际测试,直接在虚拟环境中采用 pip 安装即可,安装的 pip 命令如下:

pip install gym[atari]
pip install autorom[accept-rom-license]

3.3.2 测试能否成功运行 Atari 环境

因为 Atari 的环境真的非常丰富,总共可查的有62个环境,具体可以看 Gym 的官方文档说明:Complete List - Atari - Gym Documentation (gymlibrary.dev)

我在这里就用非常经典的 Breakout 游戏作为演示,来测试是否已经成功安装 gym[atari],测试的代码如下:

import gym


env = gym.make("ALE/Breakout-v5", render_mode="human")
env.reset()
done = False
while not done:
    action = env.action_space.sample()
    observation, reward, done, info = env.step(action)
env.close()

需要注意的是,Atari 环境的渲染需要在创建环境时就指出渲染的模式,否则会渲染失败。

如果已经成功安装,应该能看到如下界面:

在这里插入图片描述

图10. Breakout-v5 环境运行效果图

3.4 安装 gym[mujoco]

官方 GitHub 指导中很明确的指出,从 “_v4” 版本开始,MuJoCo 环境不再依赖 mujoco-py,而是改为依赖 mujoco。且建议采用 pip install gym[mujoco] 来安装新版本的 MuJoCo 环境,采用 pip install gym[mujoco_py] 来安装旧版本的 MuJoCo 环境。

我因为有之前在 Windows 系统上安装 MuJoCo 环境的经历,并没有直接采用官方建议的这种 pip 安装方式进行安装,而是综合网上其他博客中的方法进行安装的。

参考的博客链接:

Mujoco210和Mujoco-py的安装 - 知乎 (zhihu.com)

Ubuntu20.04安装mujoco_小帅吖的博客-CSDN博客_ubuntu安装mujoco

并且由于上述安装的 gym 版本是 0.21.0,为了确保环境的适用性,我选择安装 mujoco 2.1.0,与之对应的就需要安装旧版本的 mujoco-py,具体安装流程如下。

3.4.1 官方 GitHub 下载 mujoco 2.1.0 并安装

首先前往 DeepMind/MuJoCo 官方 GitHub 链接:Release 2.1.0 · deepmind/mujoco (github.com)

由于是在 Ubuntu 系统下进行安装,所以选择并下载 mujoco210-linux-x86_64.tar.gz

之后把下载的压缩包放在 Home 文件夹下,然后输入如下命令:

mkdir ~/.mujoco
tar -zxvf mujoco210-linux-x86_64.tar.gz -C ~/.mujoco

然后需要添加环境变量,先输入以下命令打开环境变量的文本:

gedit ~/.bashrc

在文档最后一行输入如下内容:

export LD_LIBRARY_PATH=~/.mujoco/mujoco210/bin

保存并退出文本编辑器,然后更新环境变量:

source ~/.bashrc

在安装完成后,需测试是否成功安装。输入如下指令进行测试:

cd ~/.mujoco/mujoco210/bin
./simulate ../model/humanoid.xml

如果出现如下界面,证明 mujoco 2.1.0 安装成功:

在这里插入图片描述

图11. mujoco 2.1.0 安装完成后测试

3.4.2 官方 GitHub 下载 mujoco-py 并安装

首先前往 OpenAI/mujoco-py 官方 GitHub 链接:openai/mujoco-py: MuJoCo is a physics engine for detailed, efficient rigid body simulations with contacts. mujoco-py allows using MuJoCo from Python 3. (github.com)

下载并解压至 ~/mujoco-py 文件夹下,随后激活之前创建的 conda 环境并进行安装:

conda activate py37
cd ~/mujoco-py
pip3 install -U 'mujoco-py<2.2,>=2.1'
pip install -r requirements.txt
pip install -r requirements.dev.txt
python3 setup.py install

然后需要添加环境变量,先输入以下命令打开环境变量的文本:

gedit ~/.bashrc

在文档最后一行输入如下内容:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/nvidia 

保存并退出文本编辑器,然后更新环境变量:

source ~/.bashrc

在安装完成后,需测试是否成功安装。建一个 Python 脚本并使用前面刚刚创建的环境,输入如下代码进行运行:

import mujoco_py
import os
mj_path = mujoco_py.utils.discover_mujoco()
xml_path = os.path.join(mj_path, 'model', 'humanoid.xml')
model = mujoco_py.load_model_from_path(xml_path)
sim = mujoco_py.MjSim(model)

print(sim.data.qpos)
# [0. 0. 1.41. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

sim.step()
print(sim.data.qpos)
#[-1.12164337e-05  7.29847036e-22  1.39975300e+00  9.99999999e-01
#  1.80085466e-21  4.45933954e-05 -2.70143345e-20  1.30126513e-19
# -4.63561234e-05 -1.88020744e-20 -2.24492958e-06  4.79357124e-05
# -6.38208396e-04 -1.61130312e-03 -1.37554006e-03  5.54173825e-05
# -2.24492958e-06  4.79357124e-05 -6.38208396e-04 -1.61130312e-03
# -1.37554006e-03 -5.54173825e-05 -5.73572648e-05  7.63833991e-05
# -2.12765194e-05  5.73572648e-05 -7.63833991e-05 -2.12765194e-05]

需要注意的是,如果刚刚创建的脚本是在 Pycharm 中运行的,则还需要进行额外的设置。并且后续在 Pycharm 中每一个新的 Python 脚本都需要进行如下设置:

点击 Pycharm 菜单栏 Run->Edit Configurations->Environment variables,添加的环境变量的 Name 为 LD_LIBRARY_PATH,Value 为 $LD_LIBRARY_PATH:/home/XXX/.mujoco/mujoco210/bin:/usr/lib/nvidia

  • 注:Value 中的 XXX 是你的用户名。

在这里插入图片描述

图12. Pycharm 环境变量配置

在 Pycharm 中运行上述脚本,会报如下错误:

fatal error: GL/osmesa.h: 没有那个文件或目录

看其他博客的说法,这里主要是缺少了一个关键的包,采用下述命令安装即可:

sudo apt install libosmesa6-dev

我再次运行脚本文件的过程中,报了新的错误:

FileNotFoundError: [Errno 2] No such file or directory: ‘patchelf’: ‘patchelf’

这里是缺少另一个关键包,采用下述命令安装:

sudo apt-get update -y
sudo apt-get install -y patchelf

到这里,我的脚本就可以正常运行了。上文提到的解决方法都是我在这篇博客中看到的:安装mujoco_py遇到的一些问题与解决方法,如command ‘gcc‘ failed with exit status 1_陈三章的博客-CSDN博客

如果还有其他的一些报错,可以尝试去这篇博客中解决一下。

3.4.3 测试能否成功运行 MuJoCo 环境

运行下述代码进行测试:

import gym


env = gym.make("Ant-v2")
env.reset()
done = False
for _ in range(1000):
    env.render()
    action = env.action_space.sample()
    observation, reward, done, info = env.step(action)
env.close()

如果前文安装顺利的话,应该会出现如下界面:

在这里插入图片描述

图13. Ant-v2 环境运行效果图

至此,完整版的 Gym 环境安装完毕。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/44517.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【一文秒懂——YAML配置文件】

目录 1. YAML配置文件 2. 实例 2.1 将原application.properties改为application.yml&#xff1a; 2.2 将原application-dev.properties改为application-dev.yml&#xff1a; 1. YAML配置文件 在Spring Boot项目中&#xff0c;还可以使用YAML配置文件&#xff0c;这是一种使…

一文搞懂漏洞严重程度分析

漏洞的级别定义主要从两个维度进行判断&#xff1b; 1、可利用性 2、影响性 可利用性指标 可利用性指标组刻画脆弱性组件&#xff08;即包含漏洞的事物&#xff09;的特征&#xff0c;反映漏洞利用的难易程度和技术要求等。可利用性指标组包含四个指标&#xff0c;分别是攻击…

最新阿里云GPU服务器租用配置费用价格表出炉(多配置报价)

阿里云GPU服务器优惠3折GPU云服务器vgn6i优惠价469.46元/月起&#xff0c;GPU云服务器gn6i和GPU云服务器gn6v均有活动&#xff0c;NVIDIA T4及V100均有活动&#xff0c;主机教程网 来详细说下阿里云GPU云服务器收费标准价格表&#xff0c;再来说说GPU云服务器计费模式&#xff…

Python学习笔记(十八)——Pandas进阶

文章主要内容文件操作&#xff1a; • 文件读取: read_csv(csv),read_table(表格),read_excl(excel) • 文件写入&#xff1a;to_csv, to_excel 数据清洗&#xff1a; • 处理缺失值&#xff1a;isnull(识别), dropna (过滤), fillna(填充) • 数据转换&#xff1a;drop_duplic…

MVCC多版本并发控制

目录 1、数据库并发场景 2、当前读和快照读 3、MVCC的隔离级别 4、实现原理 4.1、隐藏字段 ​​​​​​​4.2、Undo_log&#xff08;版本链&#xff09; 4.3、Read View&#xff08;读视图&#xff09; 4.4、RC、RR隔离级别下的快照读有什么区别 MVCC&#xff0c;多版…

文献认证!Kamiya艾美捷抗酒石酸酸性磷酸酶TRAP染色试剂盒

人类及动物体骨组织不断地进行着重建&#xff0c;骨重建过程包括骨的分解吸收与新骨的形成。破骨细胞&#xff08;Osteoclast&#xff0c;OC&#xff09;负责骨分解与吸收&#xff0c;而成骨细胞&#xff08;osteoblast&#xff0c;OB&#xff09;负责新骨形成。破骨细胞贴附在…

【WAX链游】发布一个免费开源的MiningNetwork合约脚本BTK

前言 挖矿网络&#xff08;Mining Network&#xff09;官网&#xff1a; https://miningnetwork.io 挖矿网络&#xff08;Mining Network&#xff09;合约脚本&#xff1a;https://github.com/encoderlee/MiningNetworkBot 回顾之前我们推出过的免费开源链游脚本&#xff1a…

【React技术】JSX在企业级项目的运用and一个元素渲染demo

JSX 它被称为JSX,是JavaScript的语法扩展。我们建议在React中使用JSX。JSX可以很好地描述UI应该呈现它应该具有的基本交互形式。JSX可能会让人想起模板语言,但它具有JavaScript的所有功能。 const element = <h1>Hello, world!</h1>;React认为渲染逻辑与其他UI…

红眼睛红外成像微型成像仪快速刷新与动态显示温度测量

默认参数下&#xff0c;设备的温度测量和数据输出频率为每秒 4Hz&#xff0c;这一输出速率基本可以保证所有计 算机和手机都能够正常显示实时画面&#xff0c;但导致的问题是实时画面有卡顿的感觉。数据的处理速度与 计算机和手机的配置高低有直接关系&#xff0c;下面仅以…

VScode 基础使用教程

VScode 的安装以及使用基础&#xff08;C配置&#xff09; 奉上VScode安装物资 VScode 的安装 进入VScode官网&#xff0c;点击 Download for windows 即可得到安装包&#xff0c;运行即可。 编译器G的配置 下载 MinGW&#xff0c;将其保存至任意磁盘中&#xff08;下面默认C…

在 Navicat 中执行数据库范围搜索

无论你选择的数据库是 MySQL、MariaDB、SQL Server、Oracle 和 PostgreSQL&#xff0c;还是基于云的服务&#xff0c;如 Amazon RDS、Amazon Aurora、Amazon Redshift、SQL Azure、Oracle Cloud 和 Google Cloud&#xff0c;你都将不可避免地要寻找一些你不知道位置的数据。在这…

简单3步轻松搭建个人博客

对于计算机专业的学生&#xff0c;课余时间最有价值的事莫过于写技术博客了。我们可以通过博客记录生活经历、学习过程、技术成长&#xff0c;同时博客还能树立个人品牌&#xff0c;结识更多兴趣相投的人。 从计算机技术角度而言&#xff0c;博客的搭建及维护会让你的技术不断…

猴子也能学会的jQuery——总结习题

&#x1f4da;系列文章—目录&#x1f525; 猴子也能学会的jQuery第一期——什么是jQuery 猴子也能学会的jQuery第二期——引用jQuery 猴子也能学会的jQuery第三期——使用jQuery 猴子也能学会的jQuery第四期——jQuery选择器大全 猴子也能学会的jQuery第五期——jQuery样式操作…

字符串压缩(三)之短字符串压缩

一、通用算法的短字符压缩 开门见山&#xff0c;我们使用一段比较短的文本&#xff1a;Narrator: It is raining today. So, Peppa and George cannot play outside.Peppa: Daddy, its stopped raining. 使用ZSTD与LZ4分别压缩一下上面这段短文本。下面分别是它们的压缩结果。…

良好基本面引领发展,中国春来将聚势而强?

2022年&#xff0c;是一个挑战与机遇共存的年份。 一方面&#xff0c;作为“双减”、《民促法实施条例》落地执行的第一年&#xff0c;转型难题困扰着广大K12教培企业。另一方面&#xff0c;职业教育、教育信息化利好政策频出&#xff0c;不少从业者藉此打开局面、柳暗花明。 …

[附源码]Python计算机毕业设计Djangospringboot作业管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

项目经理和产品经理正在用哪些管理工具?

项目管理包括定义项目目标&#xff0c;指定行程和安排任务&#xff0c;以达到特定的目标。在项目管理过程中&#xff0c;很多工具可以使项目管理更有效、更高效。&#xff08;项目管理资料文末&#xff09; 跟大家介绍一下项目经理常用的项目管理工具&#xff1a; 1、甘特图 …

[附源码]计算机毕业设计springboot动物保护协会网站

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Seata中的AT事务模式是如何实现行锁

Seata中的AT事务模式里面的全局锁是行锁,这也是AT事务模式和XA事务模式在锁粒度上的最大区别。我们可以在官网中可以看到这样一个例子: 两个全局事务 tx1 和 tx2,分别对 a 表的 m 字段进行更新操作,m 的初始值 1000。tx1先开始,开启本地事务,拿到本地锁,更新操作 m = 10…

2022安洵杯web题复现

前言 个人觉得赛题质量蛮好的&#xff0c;只是自己太菜了&#xff0c;花了很长时间都在琢磨第一道web&#xff0c;因为一些细节上的问题导致一直解不出来。赛后就找师傅的wp重新去复现一下&#xff0c;总结自己的问题&#xff0c;在此记录一下&#xff0c;以便日后复习。 bad…