Skip to content

调试与热更新 ​

写完脚本按下运行,结果什么都没发生——这在 Mod 开发中太常见了。问题可能是拼写错误、事件名写错、回调参数取错,但没有有效的调试手段,你只能靠猜。本节将系统介绍从日志打印到断点调试的全套工具链,让你快速定位和修复问题。

你将学到

  • print 和 mod_log 两种日志打印方式
  • 调试工具窗口的使用(搜索、过滤、实时执行 Python)
  • 热更新的使用方法和限制
  • VS Code 断点调试(MCDev Tools 插件)
  • PyCharm 断点调试(MC Studio Helper 插件)
  • 常见脚本错误的排查方法

日志打印 ​

日志打印是最基础也最常用的调试手段。中国版 ModSDK 支持两种方式。

方式一:print(简单直接) ​

python
print "===== ServerSystem init ====="
print("玩家加入:{}".format(playerId))
print("物品信息:", itemDict)

print 的输出会显示在调试工具窗口中。建议加上唯一前缀(如 [TomatoMod]),方便在大量日志中搜索:

python
print("[TomatoMod] 绿宝石数量变化:{} -> {}".format(oldCount, newCount))

方式二:mod_log(推荐) ​

mod_log 是官方提供的日志模块,支持分级输出,在调试工具中会以不同颜色显示:

python
from mod_log import logger

logger.debug("调试信息:slot=%d", slot)     # [DEBUG] 灰色
logger.info("玩家 %s 加入游戏", playerId)   # [INFO]  白色
logger.warning("物品不存在:%s", itemName)    # [WARNING] 黄色
logger.error("创建 UI 失败!")               # [ERROR] 红色

该用哪个?

开发阶段用 print 快速查看变量没问题。但正式项目建议用 mod_log,因为:

  1. 支持日志级别过滤,上线前可以只保留 warning 以上
  2. 在调试工具中有颜色区分,一眼看出严重程度
  3. mod_log 和 logging 都在 Python 模块白名单中,可安全使用

实用打印技巧 ​

python
# 打印事件的全部参数(快速了解有哪些字段)
def OnPlayerAttack(self, args):
    print("[TomatoMod] PlayerAttackEntityEvent args:", args)

# 打印组件返回值(确认 API 是否正常工作)
items = itemComp.GetPlayerAllItems(
    serverApi.GetMinecraftEnum().ItemPosType.INVENTORY
)
print("[TomatoMod] 背包物品:", items)

# 在关键流程加入检查点
print("[TomatoMod] >>> 进入 _CountEmeralds")
# ...逻辑代码...
print("[TomatoMod] <<< 退出 _CountEmeralds, total=", total)

调试工具 ​

从 MCStudio 启动开发测试时,调试工具会自动打开。它已经取代了旧版"脚本测试日志",成为官方主力调试工具。

主要功能 ​

功能说明
日志查看实时显示 print 和 mod_log 输出,支持颜色分级
关键字搜索输入关键字按 Enter 跳转,支持正则、大小写敏感、全字匹配
标签过滤按 Developer / Engine / INFO 等标签筛选日志
暂停/恢复暂停滚动时日志不丢失,恢复后自动补全
错误跳转点击错误日志中的文件链接,IDE 自动跳转到对应代码行
Python 执行在输入框中写 Python 代码,选择"客户端运行"或"服务端运行"实时执行
组件同步将修改后的代码同步到手机测试客户端

实时执行 Python ​

这是调试工具最强大的功能之一。在游戏运行时,你可以直接在输入框中执行 Python 代码:

python
# 在"服务端运行"模式下执行
import mod.server.extraServerApi as serverApi
comp = serverApi.GetEngineCompFactory().CreateGame(serverApi.GetLevelId())
print(comp.GetAllScoreboardObjects())

这样可以在不重启游戏的情况下验证 API 调用结果、查看游戏状态,甚至临时修复数据。

注意

实时执行的代码只在当前会话有效,不会保存。它适合快速验证和排查,不要用来替代正式代码。

连接手机测试 ​

调试工具支持连接手机测试客户端查看远程日志:

  1. 确保手机和电脑在同一 WiFi 网络
  2. 在手机上启动开发者测试包,进入主界面
  3. 在调试工具中点击"客户端IP连接",输入手机 IP 地址
  4. 连接成功后,手机端的日志会实时显示在调试工具中

热更新 ​

热更新让你修改代码后不需要重启游戏就能看到效果,极大提升开发效率。

使用方法 ​

  1. 游戏保持运行状态
  2. 在 IDE 中修改 Python 文件并保存
  3. 切换回 MCStudio 或游戏窗口
  4. 调试工具显示:"正在重载相关的Python模块"
  5. 修改立即生效

快捷操作

  • 在游戏中按 R 键可手动触发热重载脚本
  • 按小键盘 0 键可重载整个存档
  • ModPC 开发菜单(右上角)也有"热更"按钮

热更新的限制 ​

热更新只对函数体内部修改可靠生效。以下修改需要退出重进存档:

修改类型热更新是否生效
修改函数内部实现生效
修改全局变量不一定生效
新增类不一定生效
新增文件不一定生效
修改 __init__ 中的监听注册不生效(需要重新初始化)
修改 JSON 资源文件不生效(需要重启)

热更新失败怎么办?

如果修改后没有生效,保存文件后退出到主菜单再重新进入存档,即可完全重新加载所有 Mod 代码。这是最可靠的"万能方案"。

断点调试 ​

日志打印只能看到你预设的输出,而断点调试可以让程序在指定位置暂停,实时查看所有变量的值、调用栈、执行路径。这是定位复杂 Bug 的终极手段。

中国版 ModPC 开发包已支持基于 ptvsd / DAP(Debug Adapter Protocol) 的 Python 断点调试。

VS Code:MCDev Tools 插件(推荐) ​

MC Dev Tools 是一个一站式的 VS Code 调试插件,支持一键启动游戏并附加调试器。

安装:

  1. 在 VS Code 扩展商店搜索 MC Dev Tools(发布者:dofes)并安装
  2. 确保已安装 Python 扩展

配置 launch.json:

在项目根目录的 .vscode/launch.json 中添加:

json
{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "mcdev-tools",
      "request": "launch",
      "name": "Minecraft Python Debug",
      "timeout": 60000,
      "dapConfig": {
        "justMyCode": false
      }
    }
  ]
}

使用:

  1. 在代码中点击行号左侧设置断点(红色圆点)
  2. 按 F5 选择 "Minecraft Python Debug" 配置
  3. 插件自动启动 mcdk → 启动游戏 → 附加调试器
  4. 当代码执行到断点时,VS Code 会自动暂停,左侧面板显示:
    • 变量:当前作用域的所有变量和值
    • 调用栈:函数调用链路
    • 监视:添加自定义表达式实时监控

调试控制:

操作快捷键说明
继续F5运行到下一个断点
单步跳过F10执行当前行,不进入函数内部
单步进入F11进入函数内部
单步跳出Shift+F11执行完当前函数,返回调用处

注入模式(备选)

如果游戏已经在运行,可以用注入模式附加调试器:

json
{
  "type": "mcdev-tools-inject",
  "request": "launch",
  "name": "Minecraft Debug (Inject)",
  "port": 5678,
  "dapConfig": {
    "justMyCode": false
  }
}

插件会查找运行中的 Minecraft 进程,注入 debugpy 并连接。

PyCharm:MC Studio Helper 插件 ​

MC Studio Helper 为 PyCharm 用户提供了类似的调试体验。

环境要求:

  • PyCharm 2025.1 及以上版本
  • ModPC 开发包 3.7.0.222545 及以上版本
  • LSP4IJ 插件(随 MC Studio Helper 自动安装)

安装:

  1. 打开 PyCharm → Settings → Plugins
  2. 搜索 MC Studio Helper 并安装
  3. 重启 PyCharm

第一步:添加运行配置

  1. 点击右上角 Debug 按钮旁的 "Edit Configurations..."
  2. 点击 + 添加 MC Studio Helper 类型的运行配置
  3. 填写配置信息(开发包路径等)

第二步:运行游戏

点击运行按钮启动游戏,日志输出界面会自动打开。此时可以:

操作方式
热重载脚本切回游戏后按 R 键
重载存档按小键盘 0 键
跳转到错误代码点击日志中的文件链接

第三步:断点调试

  1. 确认日志开头有调试器就绪提示
  2. 再添加一个 调试适配器协议(DAP) 类型的运行配置
  3. 点击"创建新服务器" → 选择 Python 模板
  4. 设置:调试模式 = 附加,地址 = 127.0.0.1,端口 = 5678
  5. 填写 DAP 参数 JSON:
json
{
  "name": "Attach",
  "type": "python",
  "request": "attach",
  "redirectOutput": true,
  "connect": {
    "host": "127.0.0.1",
    "port": 5678
  },
  "pathMappings": [
    {
      "localRoot": "${workspaceFolder}",
      "remoteRoot": "${workspaceFolder}"
    }
  ],
  "debugOptions": [
    "ShowSpecialMembers",
    "ShowPrivateMembers",
    "ShowFunctionMembers",
    "ShowBuiltinMembers"
  ]
}
  1. 以**调试模式(Debug)**运行该配置
  2. 在 PyCharm 中设置断点:点击行号左侧两次(第一次点击空白处,第二次点击行内)
  3. 当断点命中时,调试窗口显示变量、调用栈等信息
  4. 按 F9 继续运行

PyCharm 断点的特殊操作

PyCharm 中使用 DAP 调试时,设置断点需要点击两次才能生效,这与 VS Code 单击设置断点不同。

常见错误排查 ​

错误日志怎么读 ​

Python 错误会在调试工具中显示完整的 traceback(回溯信息):

Traceback (most recent call last):
  File "Scripts/server/ServerSystem.py", line 42, in OnInventoryChanged
    count = self._CountEmeralds(playreId)
                                ^^^^^^^^^
AttributeError: 'TomatoServerSystem' object has no attribute '_CountEmeralds'

阅读顺序:

  1. 从下往上读——最后一行是错误类型和描述
  2. 倒数第二行是出错的代码
  3. File 行告诉你文件名和行号

常见错误类型 ​

错误原因解决
ImportError模块名/路径拼写错误检查文件名和 import 路径是否一致
NameError使用了未定义的变量检查变量名拼写,确认作用域
AttributeError对象没有这个属性/方法检查方法名拼写,确认 API 是否存在
TypeError参数类型不对或数量不对检查 API 文档中的参数要求
KeyError字典中不存在这个键用 .get(key, default) 安全取值
SyntaxError语法错误(缩进、括号等)检查代码缩进(Python 2 用空格不用 Tab 混用)

排查清单 ​

当脚本"什么都没发生"时,按以下顺序排查:

  1. 检查日志窗口——有没有报错?如果有,从下往上读 traceback
  2. 确认事件名拼写——InventoryItemChangedServerEvent 这种长名称很容易打错
  3. 确认监听注册——ListenForEvent 是否在 __init__ 中被调用?
  4. 加 print 检查点——在回调函数第一行加 print(">>> 事件触发了"),确认回调是否被调用
  5. 检查参数名——事件回调的字典 key 是否正确(如 playerId 不是 playerID)
  6. 确认 mod.json 注册——服务端和客户端的 System 是否在 mod.json 中正确注册
  7. 检查热更新限制——如果修改了 __init__ 或新增文件,需要退出重进存档

最有效的调试策略

先缩小范围,再定位细节。 从事件回调入口开始加 print,确认事件是否触发、参数是什么,然后逐步深入。大部分问题在前 3 步就能发现。断点调试留给复杂的逻辑问题。

打包错误速查 ​

提交审核时的常见打包错误:

错误码含义解决
8Python 脚本打包错误检查语法错误,确保 Python 2 兼容
10缺少 manifest.json确认 behavior_packs 中有 manifest.json
16文件名包含中文或特殊字符文件名只用英文、数字、下划线
18使用了未授权的 API / 语法检查 Python 模块白名单
25JSON 文件编码错误确保所有 JSON 文件为 UTF-8 编码
37manifest.json 缺少 min_engine_version添加正确的 min_engine_version 字段

小结 ​

要点说明
日志打印print 快速调试,mod_log 分级输出(推荐正式项目使用)
调试工具MCStudio 自动启动,支持搜索、过滤、实时执行 Python
热更新修改函数体后保存即生效,新增类/文件/全局变量需退出重进
VS Code 断点调试安装 MC Dev Tools 插件,F5 一键启动调试
PyCharm 断点调试安装 MC Studio Helper 插件,DAP 附加模式调试
读错误日志从下往上读 traceback,最后一行是错误类型
排查顺序日志报错 → 事件名 → 监听注册 → print 检查点 → 参数名 → mod.json
打包错误语法错误(8)、缺 manifest(10)、中文文件名(16)、编码(25)

恭喜!你已经完成了 Python 脚本开发的全部 9 节教程。从环境搭建、CS 架构、事件系统、组件调用、跨端通信、UI 界面、计分板实战到调试技巧,你已经具备了独立开发中国版 Mod 的核心能力。接下来可以回到开发指南深入学习更多高级主题,或者直接动手开发你自己的作品!