Skip to content

脚本管理器

脚本管理器是 PySpigot 的事实核心,负责加载、运行和卸载脚本。它还监督脚本与 PySpigot 内的所有其他管理器之间的交互。通常情况下,您不需要直接与脚本管理器交互,因为大多数操作都会由脚本管理器自动执行。但是,如果需要的话,您可以从您的脚本中访问脚本管理器,以便以编程方式加载、运行或卸载脚本。

有关将脚本管理器导入到您的脚本的说明,请访问常规信息页面。

警告

在通过其他脚本加载/卸载脚本时,请极度小心。这是一个功能强大但潜在具有破坏性的功能,可能导致意外行为和错误。

脚本管理器使用

使用脚本管理器加载、运行和卸载脚本相对简单。有三个可用于执行这些操作的函数:

  • script.loadScript(name): 使用给定名称加载脚本。返回表示加载脚本结果的RunResult。有关RunResult的更多信息,请参见下面的部分。
  • script.loadScript(path): 使用给定文件路径加载脚本。返回表示加载脚本结果的RunResult。有关RunResult的更多信息,请参见下面的部分。
  • script.unloadScript(name): 卸载具有给定名称的脚本。如果脚本成功卸载,此函数将返回True,如果脚本无法成功卸载,则返回False。通常伴随着在控制台和脚本日志文件中打印的错误消息(如果启用了脚本的文件记录)。

另外,脚本管理器还包含其他几个有用的功能:

  • script.isScriptRunning(name): 检查是否有以给定名称运行的脚本。相应地返回TrueFalse
  • 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
import pyspigot as ps # (1)!
from dev.magicmq.pyspigot.manager.script import RunResult # (2)!

run_result = ps.script.loadScript('script.py') # (3)!

if (run_result == RunResult.SUCCESS): # (4)!
    print('The script is running!')
elif (run_result == RunResult.FAIL_ERROR): # (5)!
    print('The script did not load due to an error!')
  1. 这里我们将PySpigot导入为ps,以便使用脚本管理器(script)。

  2. 在这里我们导入RunResult,以便稍后使用它来确定加载脚本的结果。

  3. 在这里,我们加载名为script.py的脚本,并将加载脚本的结果(RunResult)赋值给run_result

  4. 在这里,我们检查加载脚本的结果是否为RunResult.SUCCESS(意味着脚本已成功加载并正在运行),如果是,则向控制台打印消息。

  5. 在这里,我们检查加载脚本的结果是否为RunResult.FAIL_ERROR(意味着由于错误而未能加载脚本),如果是,则向控制台打印消息。

卸载一个脚本

1
2
3
4
5
6
import pyspigot as ps # (1)!

unload_result = ps.script.unloadScript('script.py') # (2)!

if (unload_result == True): # (3)!
    print('The script unloaded successfully without errors!')
  1. 这里我们将PySpigot导入为ps,以便使用脚本管理器(script)。

  2. 在这里,我们卸载名为script.py的脚本。将返回值(TrueFalse,取决于结果)赋值给unload_result

  3. 在这里,我们检查卸载脚本的结果是否为True(表示脚本已成功卸载且无错误),如果是,则向控制台打印消息。

概要

  • 使用脚本管理器从另一个脚本中加载/运行和卸载脚本。
  • 必须同时使用 loadScriptrunScript 来加载和运行脚本,因为加载和运行是两个独立的操作。
  • loadScript 返回一个脚本对象,应该传递给 runScript。如果脚本未成功加载,它将返回 None
  • runScript 返回一个 RunResult,可用于确定运行脚本的结果。
  • unloadScript 返回 TrueFalse,如果脚本成功卸载则返回 True,如果没有则返回 False
  • 绝对不要尝试从脚本内部卸载脚本。这将导致错误和bug。