mujoco-py修改xml后Hopper-v4仍加载原模型的路径问题排查
核心原因
Hopper-v4是Gym(现Gymnasium)内置的MuJoCo环境,它的默认模型资源是打包在Python环境的gym安装包内部的,不会读取你项目目录下自行放置/修改的同名hopper.xml文件。哪怕你删掉项目里的xml,只要gym包本身的资源没动,加载的就永远是内置的原版模型。
部分场景下mujoco-py会生成预编译的模型二进制缓存,就算你改了对应路径的xml,缓存没清的话也会直接加载旧模型,不会重新读xml。
定位实际加载的模型路径
执行以下代码可以直接打印当前环境真实读取的xml文件位置:
import gymnasium as gym env = gym.make("Hopper-v4") print(env.unwrapped.model_path)
正常输出路径会在你当前Python环境的site-packages/gymnasium/envs/mujoco/assets/目录下,和你自己项目文件夹里的文件没有关联。
mujoco-py的默认缓存路径在当前用户目录的.mujoco/文件夹下,预编译的模型缓存会存放在该目录的子文件夹中,触发时会跳过xml解析步骤直接加载旧模型。
自定义模型的正确实现方式
不要直接替换内置环境的默认文件,用以下两种方式加载自定义xml即可:
- 直接初始化时传参覆盖默认xml路径,不需要额外注册:
env = gym.make( "Hopper-v4", xml_file="your/custom/hopper.xml的绝对路径" )
- 注册独立的自定义环境id,避免和内置环境冲突:
import gymnasium as gym from gymnasium.envs.mujoco.hopper_v4 import HopperEnv gym.register( id="CustomHopper-v0", entry_point=HopperEnv, kwargs={"xml_file": "your/custom/hopper.xml的绝对路径"} ) env = gym.make("CustomHopper-v0")
缓存清理方法:如果修改对应位置的xml后依然加载旧模型,直接删除用户目录下
.mujoco/pyxb/、.mujoco/mjpc/两个子文件夹内的所有文件,重启Python进程后就会重新解析xml生成新模型。
内容的提问来源于stack exchange,提问作者Hobbit
相关产品推荐
相关产品推荐

