脚本管理器¶
脚本管理器是 PySpigot 的事实核心,负责加载、运行和卸载脚本。它还监督脚本与 PySpigot 内的所有其他管理器之间的交互。通常情况下,您不需要直接与脚本管理器交互,因为大多数操作都会由脚本管理器自动执行。但是,如果需要的话,您可以从您的脚本中访问脚本管理器,以便以编程方式加载、运行或卸载脚本。
有关将脚本管理器导入到您的脚本的说明,请访问常规信息页面。
警告
在通过其他脚本加载/卸载脚本时,请极度小心。这是一个功能强大但潜在具有破坏性的功能,可能导致意外行为和错误。
脚本管理器使用¶
使用脚本管理器加载、运行和卸载脚本相对简单。有三个可用于执行这些操作的函数:
script.loadScript(name): 使用给定名称加载脚本。返回表示加载脚本结果的RunResult。有关RunResult的更多信息,请参见下面的部分。script.loadScript(path): 使用给定文件路径加载脚本。返回表示加载脚本结果的RunResult。有关RunResult的更多信息,请参见下面的部分。script.unloadScript(name): 卸载具有给定名称的脚本。如果脚本成功卸载,此函数将返回True,如果脚本无法成功卸载,则返回False。通常伴随着在控制台和脚本日志文件中打印的错误消息(如果启用了脚本的文件记录)。
另外,脚本管理器还包含其他几个有用的功能:
script.isScriptRunning(name): 检查是否有以给定名称运行的脚本。相应地返回True或False。script.getScriptPath(name): 获取具有给定名称的脚本的绝对路径。如果在scripts文件夹中使用了子文件夹,则此函数非常有用。script.getScript(name): 获取正在运行的脚本。如果找到具有给定名称的正在运行的脚本,则返回一个Script对象,否则返回None。有关Script对象的更多信息,请参阅下面的Script Object部分。script.getLoadedScripts(): 返回所有已加载/运行的脚本(作为Script对象)的集合。script.getLoadedScriptNames(): 返回所有已加载/正在运行的脚本名称(作为str)的集合。script.getAllScriptPaths(): 返回Set,按字母顺序排列,在scripts文件夹中所有脚本路径(考虑子文件夹)。script.getAllScriptNames(): 返回按字母顺序排列的Set,包含scripts文件夹中所有脚本的名称(考虑子文件夹)。
危险
永远不要 在脚本内部卸载脚本!这会导致意外行为和错误。
运行结果¶
RunResult是表示加载脚本结果的值。两个loadScript函数均返回代表加载操作结果的RunResult。有四种可能的结果:
| RunResult | 描述 |
|---|---|
SUCCESS |
脚本已成功加载并运行。目前脚本正在运行中。 |
FAIL_DISABLED |
运行脚本失败,因为根据其脚本选项(在script_options.yml或其他地方)脚本被禁用。 |
FAIL_PLUGIN_DEPENDENCY |
运行脚本失败,因为它依赖于服务器上未运行的一个或多个插件。 |
FAIL_ERROR |
运行脚本失败,因为在运行时出现错误。错误信息将被打印到服务器控制台(如果启用,则也会打印到脚本日志文件中)。 |
FAIL_DUPLICATE |
运行脚本失败,因为已经有一个同名脚本正在运行。 |
FAIL_SCRIPT_NOT_FOUND |
运行脚本失败,因为在scripts文件夹中找不到具有指定名称的脚本。 |
通过导入dev.magicmq.pyspigot.manager.script.RunResult来访问RunResult类。
脚本对象¶
Script 对象是正在运行的脚本的内存表示。它包含与脚本相关的几个关键值,包括其名称、日志文件、选项以及底层的 Jython 解释器对象。可以使用以下函数访问这些值:
getFile(): 返回与脚本相关联的File对象。getPath(): 返回脚本的绝对路径。getName(): 返回脚本的名称。getSimpleName(): 返回脚本的名称,不包含结尾的扩展名(.py)。getOptions(): 返回表示脚本选项的ScriptOptions对象。请查看JavaDocs,以获取ScriptOptions中可用函数的列表。getInterpreter(): 返回脚本的底层 Jython 解释器对象 (PythonInterpreter)。getLogger(): 返回脚本的ScriptLogger对象。getLogFileName(): 返回脚本的日志文件名。即使在脚本的选项中禁用了文件记录,此函数始终会返回脚本的文件名。getUptime(): 返回脚本已运行的毫秒数。
Warning
在与 PySpigot 的这一部分互动时,请极度谨慎,特别是在处理底层的 Jython 解释器时。可能会出现意外行为。
代码示例¶
让我们看一些加载、运行和卸载脚本的代码:
加载和运行脚本¶
1 2 3 4 5 6 7 8 9 | |
-
这里我们将PySpigot导入为
ps,以便使用脚本管理器(script)。 -
在这里我们导入
RunResult,以便稍后使用它来确定加载脚本的结果。 -
在这里,我们加载名为
script.py的脚本,并将加载脚本的结果(RunResult)赋值给run_result。 -
在这里,我们检查加载脚本的结果是否为
RunResult.SUCCESS(意味着脚本已成功加载并正在运行),如果是,则向控制台打印消息。 -
在这里,我们检查加载脚本的结果是否为
RunResult.FAIL_ERROR(意味着由于错误而未能加载脚本),如果是,则向控制台打印消息。
卸载一个脚本¶
1 2 3 4 5 6 | |
-
这里我们将PySpigot导入为
ps,以便使用脚本管理器(script)。 -
在这里,我们卸载名为
script.py的脚本。将返回值(True或False,取决于结果)赋值给unload_result。 -
在这里,我们检查卸载脚本的结果是否为
True(表示脚本已成功卸载且无错误),如果是,则向控制台打印消息。
概要¶
- 使用脚本管理器从另一个脚本中加载/运行和卸载脚本。
- 必须同时使用
loadScript和runScript来加载和运行脚本,因为加载和运行是两个独立的操作。 loadScript返回一个脚本对象,应该传递给runScript。如果脚本未成功加载,它将返回None。runScript返回一个RunResult,可用于确定运行脚本的结果。unloadScript返回True或False,如果脚本成功卸载则返回True,如果没有则返回False。- 绝对不要尝试从脚本内部卸载脚本。这将导致错误和bug。