目录
- main
main
从 pypi 官方网站上下载 rasa 的最后一个释放版本(截止目前,最新版本为 2.2.1)的源码,解压后,在根目录下,找到 setup.py
文件,这是安装引导程序,我们主要关注的是 entry_points
,Entry points 是可以用来支持自动生成脚本的,即通过 pip
安装 rasa 后,在 Python 解释器所在的 bin 文件夹下,会生成一个 rasa
脚本,这就是为什么安装 rasa 后,我们就可以直接通过 shell 执行一些 rasa 命令,如 rasa init
。
该脚本实际上是一个 python 脚本文件
脚本第一行,shebang 标注的是执行该脚本的 python 解释器位置,也就是你安装 rasa 的 python 解释器位置,from rasa.__main__ import main
以及 sys.exit(main())
这里表明了 rasa 程序的入口在 __main__
文件的 main()
。OK,找到了项目的入口主函数,我们便从这里开始阅读 Rasa 框架的源代码。
下面是 rasa 源码的组织结构:
.
├── rasa
│ ├── __init__.py # 主要通过 version 获取 rasa 版本信息
│ ├── __main__.py # main 函数,rasa 入口
│ ├── cli/ # 命令行交互相关
│ ├── constants.py # 定义全局的一些常量,如默认的文件ming
│ ├── core/ # 与 Core 训练相关
│ ├── exceptions.py # 定义了一些异常类
│ ├── jupyter.py # 允许在 Jupyter notebook 中与 bot 对话
│ ├── keys
│ ├── model.py # 与模型操作相关
│ ├── nlu/ # 与 NLU 训练相关
│ ├── run.py # 运行模型
│ ├── server.py # 与 rasa 服务相关
│ ├── shared/ # 与各类数据的解析相关
│ ├── telemetry.py # 与遥测相关
│ ├── test.py # 与各类测试相关
│ ├── train.py # 与模型训练相关
│ ├── utils/ # 一些公共库
│ ├── validator.py # 与各类验证相关
│ └── version.py # rasa 版本信息
└── setup.py
进入 main()
后,我们首先需要做的一件事是创建 rasa 的命令行及其参数,即 create_argument_parser()
函数的实现内容,这里 rasa 根据不同的功能,共涵盖了 11 个二级子命令,部分子命令下仍设置子子命令。
scaffold.add_subparser(subparsers, parents=parent_parsers) # 与 rasa init 命令相关
run.add_subparser(subparsers, parents=parent_parsers) # 与 rasa run 命令相关
shell.add_subparser(subparsers, parents=parent_parsers) # 与 rasa shell 命令相关
train.add_subparser(subparsers, parents=parent_parsers) # 与 rasa train 命令相关
interactive.add_subparser(subparsers, parents=parent_parsers) # 与 rasa interactive 命令相关
telemetry.add_subparser(subparsers, parents=parent_parsers) # 与 rasa telemetry 命令相关
test.add_subparser(subparsers, parents=parent_parsers) # 与 rasa test 命令相关
visualize.add_subparser(subparsers, parents=parent_parsers) # 与 rasa visualize 命令相关
data.add_subparser(subparsers, parents=parent_parsers) # 与 rasa data 命令相关
export.add_subparser(subparsers, parents=parent_parsers) # 与 rasa export 命令相关
x.add_subparser(subparsers, parents=parent_parsers) # 与 rasa x 命令相关
与这部分内容密切相关的源代码位于 cli/
目录下,其中 arguments/
目录下的各个文件,根据其文件名命名与对应的命令相关联,包含各级子命令下的一些具体参数设置。而位于 cli
根目录下的各个与命令同名的文件则包含各级子命令的具体定义以及各个命令的实际入口点函数等。具体内容,可以查看代码注释。
另外 initial_project/
包含的是一个完整的 demo 项目源码文件,即执行 rasa init
后,会在你本地生成一个 demo 项目源码,实际上就是将该文件夹整体拷贝到指定的目录下而已,这点会在 rasa init
部分再次被介绍。
主函数中,其他内容主要是是一些环境设置等,对于阅读 rasa 源码,可暂且忽略这些细节,其最重要的一条语句是 cmdline_arguments.func(cmdline_arguments)
,这条语句会真正进入到各个子命令的入口函数中进行相关操作,而各个子命令的入口函数是通过各子命令的 set_defaults()
方法中定义的。
接下来,我们将分别以每个具体的 rasa 命令为起点分别探索其背后的一些工作原理。