Showing preview only (2,791K chars total). Download the full file or copy to clipboard to get everything.
Repository: wzpan/wukong-robot
Branch: master
Commit: 3fd73e075bc3
Files: 209
Total size: 2.6 MB
Directory structure:
gitextract__p4m59za/
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── ----.md
│ │ └── bug---.md
│ ├── stale.yml
│ └── workflows/
│ └── dockerimage.yml
├── .gitignore
├── .travis.yml
├── LICENSE
├── README.md
├── VERSION
├── docker/
│ ├── Dockerfile
│ └── DockerfileArm
├── docs/
│ ├── .buildinfo
│ ├── .nojekyll
│ ├── AI.html
│ ├── ASR.html
│ ├── Brain.html
│ ├── ConfigMonitor.html
│ ├── Conversation.html
│ ├── Player.html
│ ├── TTS.html
│ ├── Updater.html
│ ├── _modules/
│ │ ├── index.html
│ │ ├── logging.html
│ │ ├── plugins/
│ │ │ ├── Camera.html
│ │ │ ├── CleanCache.html
│ │ │ ├── Echo.html
│ │ │ ├── Email.html
│ │ │ ├── Geek.html
│ │ │ ├── LocalPlayer.html
│ │ │ └── Poem.html
│ │ ├── robot/
│ │ │ ├── AI.html
│ │ │ ├── ASR.html
│ │ │ ├── Brain.html
│ │ │ ├── ConfigMonitor.html
│ │ │ ├── Conversation.html
│ │ │ ├── NLU.html
│ │ │ ├── Player.html
│ │ │ ├── TTS.html
│ │ │ ├── Updater.html
│ │ │ ├── config.html
│ │ │ ├── constants.html
│ │ │ ├── drivers/
│ │ │ │ ├── apa102.html
│ │ │ │ └── pixels.html
│ │ │ ├── logging.html
│ │ │ ├── plugin_loader.html
│ │ │ ├── sdk/
│ │ │ │ ├── AbstractPlugin.html
│ │ │ │ ├── AliSpeech.html
│ │ │ │ ├── RASRsdk.html
│ │ │ │ ├── TencentSpeech.html
│ │ │ │ ├── XunfeiSpeech.html
│ │ │ │ └── unit.html
│ │ │ ├── statistic.html
│ │ │ └── utils.html
│ │ ├── snowboy/
│ │ │ ├── snowboydecoder.html
│ │ │ └── snowboydetect.html
│ │ └── wukong.html
│ ├── _sources/
│ │ ├── AI.rst.txt
│ │ ├── ASR.rst.txt
│ │ ├── Brain.rst.txt
│ │ ├── ConfigMonitor.rst.txt
│ │ ├── Conversation.rst.txt
│ │ ├── Player.rst.txt
│ │ ├── TTS.rst.txt
│ │ ├── Updater.rst.txt
│ │ ├── config.rst.txt
│ │ ├── constants.rst.txt
│ │ ├── drivers.rst.txt
│ │ ├── index.rst.txt
│ │ ├── logging.rst.txt
│ │ ├── modules.rst.txt
│ │ ├── plugin_loader.rst.txt
│ │ ├── plugins.rst.txt
│ │ ├── robot.drivers.rst.txt
│ │ ├── robot.rst.txt
│ │ ├── robot.sdk.rst.txt
│ │ ├── snowboy.rst.txt
│ │ ├── statistic.rst.txt
│ │ ├── utils.rst.txt
│ │ └── wukong.rst.txt
│ ├── _static/
│ │ ├── alabaster.css
│ │ ├── basic.css
│ │ ├── css/
│ │ │ ├── badge_only.css
│ │ │ └── theme.css
│ │ ├── custom.css
│ │ ├── doctools.js
│ │ ├── documentation_options.js
│ │ ├── jquery-3.2.1.js
│ │ ├── jquery.js
│ │ ├── js/
│ │ │ └── theme.js
│ │ ├── language_data.js
│ │ ├── pygments.css
│ │ ├── searchtools.js
│ │ ├── translations.js
│ │ ├── underscore-1.3.1.js
│ │ ├── underscore.js
│ │ └── websupport.js
│ ├── config.html
│ ├── constants.html
│ ├── drivers.html
│ ├── genindex.html
│ ├── index.html
│ ├── logging.html
│ ├── modules.html
│ ├── objects.inv
│ ├── plugin_loader.html
│ ├── plugins.html
│ ├── py-modindex.html
│ ├── robot.drivers.html
│ ├── robot.html
│ ├── robot.sdk.html
│ ├── search.html
│ ├── searchindex.js
│ ├── snowboy.html
│ ├── statistic.html
│ ├── utils.html
│ └── wukong.html
├── plugins/
│ ├── Camera.py
│ ├── CleanCache.py
│ ├── Echo.py
│ ├── Email.py
│ ├── Geek.py
│ ├── Gossip.py
│ ├── LocalPlayer.py
│ ├── Poem.py
│ ├── Reminder.py
│ ├── Volume.py
│ └── __init__.py
├── requirements.txt
├── robot/
│ ├── AI.py
│ ├── ASR.py
│ ├── BCI.py
│ ├── Brain.py
│ ├── ConfigMonitor.py
│ ├── Conversation.py
│ ├── LifeCycleHandler.py
│ ├── NLU.py
│ ├── Player.py
│ ├── Scheduler.py
│ ├── TTS.py
│ ├── Updater.py
│ ├── __init__.py
│ ├── config.py
│ ├── constants.py
│ ├── detector.py
│ ├── drivers/
│ │ ├── AIY.py
│ │ ├── __init__.py
│ │ ├── apa102.py
│ │ └── pixels.py
│ ├── logging.py
│ ├── plugin_loader.py
│ ├── sdk/
│ │ ├── AbstractPlugin.py
│ │ ├── AliSpeech.py
│ │ ├── BaiduSpeech.py
│ │ ├── FunASREngine.py
│ │ ├── History.py
│ │ ├── LED.py
│ │ ├── RASRsdk.py
│ │ ├── TencentSpeech.py
│ │ ├── Unihiker.py
│ │ ├── VITSClient.py
│ │ ├── VolcengineSpeech.py
│ │ ├── XunfeiSpeech.py
│ │ ├── __init__.py
│ │ ├── atc.py
│ │ └── unit.py
│ ├── statistic.py
│ └── utils.py
├── server/
│ ├── server.py
│ ├── static/
│ │ ├── api.css
│ │ ├── bootbox.js
│ │ ├── bubble.css
│ │ ├── config.js
│ │ ├── index.js
│ │ ├── jquery.fancybox.css
│ │ ├── jquery.fancybox.js
│ │ ├── log.js
│ │ ├── main.js
│ │ ├── modernizr.touch.js
│ │ ├── monokai-sublime.css
│ │ ├── qa.js
│ │ ├── signin.css
│ │ ├── spin.css
│ │ ├── starter-template.css
│ │ └── static.js
│ └── templates/
│ ├── api.html
│ ├── api.md
│ ├── config.html
│ ├── donate.html
│ ├── index.html
│ ├── layout.html
│ ├── log.html
│ ├── login.html
│ └── qa.html
├── snowboy/
│ ├── __init__.py
│ ├── resources/
│ │ └── common.res
│ ├── snowboydecoder.py
│ └── snowboydetect.py
├── static/
│ ├── default.yml
│ ├── qa.csv
│ ├── snowboy.umdl
│ ├── wukong.pmdl
│ ├── wukong_pi.pmdl
│ └── zhimakaimen.pmdl
├── tools/
│ ├── changelog.sh
│ ├── make_json.py
│ ├── solr_api.py
│ └── solr_tools.py
└── wukong.py
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
github: #'wzpan'
patreon: # Replace with a single Patreon username
open_collective: wukong-robot
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: ['https://wukong.hahack.com/#/donate']
================================================
FILE: .github/ISSUE_TEMPLATE/----.md
================================================
---
name: 使用求助
about: 使用遇到问题,请求帮助
title: ''
labels: operation problem
assignees: wzpan
---
**确认已寻找过答案**
我已确认在 [Github issue](https://github.com/wzpan/wukong-robot/issues) 页、[常见问题](https://github.com/wzpan/wukong-robot/wiki/troubleshooting)页、[文档](http://wukong.hahack.com) 中都查找过,没有找到类似问题和资料。我也没有 google / bing/ 百度 / duckduckgo 到相关解答。
**安装方式**
手动安装/docker安装
**操作系统**
(例如 Raspbian Stretch、Ubuntu 16.04)
**离线唤醒相关**
如果是离线唤醒相关的问题,是否已确保 `arecord temp.wav`、`aplay temp.wav` (Linux) 或 `rec temp.wav`、`play temp.wav` (Mac)已正常工作?(注意要求不能带任何其他参数)如果不能,请先配置好麦克风和音响再尝试。
—— 我已确保录音、播放都正常工作才尝试 wukong-robot 。
**问题描述**
具体说明下问题
================================================
FILE: .github/ISSUE_TEMPLATE/bug---.md
================================================
---
name: Bug 反馈
about: 反馈一个bug,帮助改进 wukong-robot
title: ''
labels: bug
assignees: wzpan
---
**确认已寻找过答案**
我已确认在 [Github issue](https://github.com/wzpan/wukong-robot/issues) 页、[常见问题](https://github.com/wzpan/wukong-robot/wiki/troubleshooting)页、[文档](http://wukong.hahack.com) 中都查找过,没有找到类似问题和资料。我也没有 google / bing/ 百度 / duckduckgo 到相关解答。
**安装方式**
手动安装/docker安装
**操作系统**
(例如 Raspbian Stretch、Ubuntu 16.04)
**离线唤醒相关**
如果是离线唤醒相关的问题,是否已确保 `arecord temp.wav`、`aplay temp.wav` (Linux) 或 `rec temp.wav`、`play temp.wav` (Mac)已正常工作?(注意要求不能带任何其他参数)如果不能,请先配置好麦克风和音响再尝试。
—— 我已确保录音、播放都正常工作才尝试 wukong-robot 。
**问题描述**
具体说明下问题
**复现步骤**
具体描述下复现步骤
================================================
FILE: .github/stale.yml
================================================
# Number of days of inactivity before an issue becomes stale
daysUntilStale: 7
# Number of days of inactivity before a stale issue is closed
daysUntilClose: 3
# Issues with these labels will never be considered stale
exemptLabels:
- pinned
- security
- bug
# Label to use when marking an issue as stale
staleLabel: wontfix
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
由于久无进展,这个 issue 已被标为过期。如果还没有后续进展,这个 issue 将被关闭。谢谢你的反馈!
# Comment to post when closing a stale issue. Set to `false` to disable
closeComment: false
================================================
FILE: .github/workflows/dockerimage.yml
================================================
name: Docker Image CI
on:
push:
branches:
- master
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: Publish to Docker Hub Registry
uses: elgohr/Publish-Docker-Github-Action@master
with:
name: wzpan/wukong-robot
username: ${{ secrets.DOCKER_GITHUB_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
dockerfile: docker/Dockerfile
- name: Publish to Github Package Registry
uses: elgohr/Publish-Docker-Github-Action@master
with:
name: docker.pkg.github.com/wzpan/wukong-robot/wukong
username: ${{ secrets.DOCKER_GITHUB_USERNAME }}
password: ${{ secrets.DOCKER_GITHUB_PASSWORD }}
registry: docker.pkg.github.com
dockerfile: docker/Dockerfile
================================================
FILE: .gitignore
================================================
# Generic files to ignore
*~
*.lock
*.DS_Store
*.swp
*.out
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
# C extensions
*.so
# Distribution / packaging
.Python
env/
build/
develop-eggs/
dist/
downloads/
eggs/
lib/
lib64/
parts/
sdist/
var/
*.egg-info/
.installed.cfg
*.egg
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.cache
nosetests.xml
coverage.xml
# Translations
*.mo
*.pot
# Django stuff/Logfiles
*.log
# Sphinx documentation
docs/_build/
# PyBuilder
target/
# Coverage reports for a specific version
.coverage
# SublimeLinter config file
.sublimelinterrc
# temp folder
temp/*
# temp file
#*.*#
#*#
\#*#
*~
.#*.*
# NetEase music account info
userInfo
# wget log
wget-log*
# some thirdparty libs
client/mic_array
login/wxqr.png
.idea/
sftp-config.json
__pycache__
================================================
FILE: .travis.yml
================================================
env:
- ARCH=x86
language: python
sudo: false
python:
- "3.5"
cache:
directories:
- "$HOME/.pip-cache/"
- "/home/travis/virtualenv/python3.8"
install:
- "pip3 install pyflakes --cache-dir $HOME/.pip-cache"
script:
- "pyflakes ."
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2016 - present Weizhou Pan
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
# wukong-robot
<p align="center">
<a href="https://wukong.hahack.com" target="_blank">
<img width="128" src="http://hahack-1253537070.file.myqcloud.com/images/wukong-icons/256_256.png" alt="wukong-robot">
</a>
</p>
<p align="center">
wukong-robot 是一个简单、灵活、优雅的中文语音对话机器人/智能音箱项目,目的是让中国的 Maker 和 Haker 们也能快速打造个性化的智能音箱。wukong-robot 还可能是第一个开源的脑机唤醒智能音箱。
</p>
<p align="center">
截至 2023 年 3 月 31 日,wukong-robot 的安装设备数已超过 13,000 台,唤醒次数累积超过了 700,000 次。
</p>
<p align="center">
<a href="https://github.com/users/wzpan/projects/2/views/1"><img alt="wukong-project" src="https://img.shields.io/badge/project-wukong-informational.svg?style=flat-square"></a>
<a href="https://wukong.hahack.com/#/donate"><img alt="捐赠" src="https://img.shields.io/badge/%EF%BF%A5-donate-green.svg?style=flat-square"></a>
<a href="#"><img alt="Python3.7+" src="https://img.shields.io/badge/Python->=3.7-blue.svg?style=flat-square"></a>
<a href="https://hub.docker.com/r/wzpan/wukong-robot"><img alt="docker-pulls" src="https://img.shields.io/docker/pulls/wzpan/wukong-robot.svg?style=flat-square&colorB=success"></a>
<a href="https://github1s.com/wzpan/wukong-robot"><img alt="browse-code" src="https://img.shields.io/badge/browse-code-purple.svg?style=flat-square"></a>
</p>
<p align="center">
<a href="https://opencollective.com/wukong-robot/contribute/tier/8131-sponsor" target="_blank"><img src="https://opencollective.com/wukong-robot/sponsors.svg?avatarHeight=36"></a>
</p>
## Table of Contents
* [特性](#特性)
* [Demo](#demo)
* [环境要求](#环境要求)
* [安装](#安装)
* [升级](#升级)
* [运行](#运行)
* [配置](#配置)
* [技能插件](#插件)
* [API接口](#api-接口)
* [捐赠](#捐赠)
* [贡献](#贡献)
* [引用](#引用)
* [联系](#联系)
* [感谢](#感谢)
* [FAQ](#faq)
* [免责声明](#免责声明)
## 特性
<p align="center">
<img src="https://wzpan-1253537070.cos.ap-guangzhou.myqcloud.com/wukong/wukong-robot-3.3.0.png" alt="wukong-robot">
</p>
* 模块化。功能插件、语音识别、语音合成、对话机器人都做到了高度模块化,第三方插件单独维护,方便继承和开发自己的插件。
* 中文支持。集成百度、科大讯飞、阿里、腾讯、OpenAI Whisper、Apple、微软Edge、VITS声音克隆TTS 等多家中文语音识别和语音合成技术,且可以继续扩展。
* 对话机器人支持。支持基于 [AnyQ](https://wukong.hahack.com/#/anyq) 的本地对话机器人,并支持接入图灵机器人、ChatGPT 等在线对话机器人。
* 全局监听,离线唤醒。支持 [Porcupine](https://github.com/Picovoice/porcupine) 和 [snowboy](https://github.com/Kitt-AI/snowboy) 两套离线语音指令唤醒引擎,并支持 Muse [脑机唤醒](https://wukong.hahack.com/#/bci) 以及行空板摇一摇唤醒等其他唤醒方式。
* 灵活可配置。支持定制机器人名字,支持选择语音识别和合成的插件。
* 智能家居。支持和 [小爱音箱](https://wukong.hahack.com/#/linkage)、[Siri](https://wukong.hahack.com/#/linkage)、mqtt、[HomeAssistant](https://wukong.hahack.com/#/smarthome) 等智能家居协议联动,支持语音控制智能家电。
* 后台配套支持。提供配套后台,可实现远程操控、修改配置和日志查看等功能。
* 开放API。可利用后端开放的API,实现更丰富的功能。
* 安装简单,支持更多平台。相比 dingdang-robot ,舍弃了 PocketSphinx 的离线唤醒方案,安装变得更加简单,代码量更少,更易于维护并且能在 Mac 以及更多 Linux 系统中运行。
wukong-robot 的功能还在不断更新迭代中,详见 [更新说明](https://github.com/wzpan/wukong-robot/wiki/update-notes) 。
wukong-robot 的工作模式:
<p align="center">
<img src="https://wzpan-1253537070.cos.ap-guangzhou.myqcloud.com/wukong/wukong-robot-workflow.png" alt="wukong-robot 的工作模式">
</p>
wukong-robot 被唤醒后,用户的语音指令先经过 ASR 引擎进行 ASR 识别成文本,然后对识别到的文本进行 NLU 解析,再将解析结果进行技能匹配,交给适合处理该指令的技能插件去处理。插件处理完成后,得到的结果再交给 TTS 引擎合成成语音,播放给用户。
虽然一次交互可能包含多次网络请求,不过带来的好处是:每一个环节都可以被修改和定制。而且我认为,到了 5G 时代,音箱的响应速度将不再成为体验问题。可定制和个性化才是未来的主流,而届时 wukong-robot 将会是更好的选择!
## Demo
<p align="center">
<img src="https://wzpan-1253537070.cos.ap-guangzhou.myqcloud.com/wukong/user-demo.jpg" alt="demo">
</p>
* Demo视频:
- [wukong-robot + ChatGPT 实现支持流式对话的智能音箱(一分半钟)](https://www.bilibili.com/video/BV1Bh411g7t2)
- [粉丝向定制版,演示对话+音乐+开放API+智能家居(五分钟)](https://www.bilibili.com/video/av50685517/)
- [使用脑机唤醒 wukong-robot](https://www.bilibili.com/video/av76739580/)
- [Google AIY Voice Kit + wukong-robot](https://www.bilibili.com/video/av81173082/)
- [Siri 联动 wukong-robot + ChatGPT](https://www.bilibili.com/video/BV1yY4y1y7oW)
- [小爱同学联动 wukong-robot](https://www.bilibili.com/video/BV1eg4y1b75Y)
- [教程:基于树莓派&wukong-robot&VITS的AI泠鸢开源智能音箱的初步实现(by @二维环状无限深势阱)](https://www.bilibili.com/video/BV1Sc411K7dv)
- [教程:实现一个虚拟管家:贾维斯(by @Echo)](https://zhuanlan.zhihu.com/p/655865035)
* 后台管理端 Demo
- 体验地址:https://bot.hahack.com (体验用户名:wukong;体验密码:wukong@2019)
## 环境要求 ##
### Python 版本 ###
wukong-robot 只支持 Python >= 3.7 且 < 3.10 ,不支持 Python 2.x 。
### 设备要求 ###
wukong-robot 支持运行在以下的设备和系统中:
* Intel Chip Mac (不支持 M1 芯片)
* 64bit Ubuntu(12.04 and 14.04)
* 全系列的树莓派(Raspbian 系统)
* Pine 64 with Debian Jessie 8.5(3.10.102)
* Intel Edison with Ubilinux (Debian Wheezy 7.8)
* 装有 WSL(Windows Subsystem for Linux) 的 Windows
## 安装 ##
见 [wukong-robot 安装教程](https://wukong.hahack.com/#/install) 。
## 升级
``` bash
python3 wukong.py update
```
如果提示升级失败,可以尝试在 wukong-robot 的根目录手动执行以下命令,看看问题出在哪。
``` sh
git pull
pip3 install -r requirements.txt
```
## 运行 ##
``` bash
python3 wukong.py
```
建议在 [tmux](http://blog.jobbole.com/87278/) 或 supervisor 中执行。
第一次启动时将提示你是否要到用户目录下创建一个配置文件,输入 `y` 即可。
然后通过唤醒词 “snowboy” 唤醒 wukong-robot 进行交互(该唤醒词可自定义)。
此外,wukong-robot 默认在运行期间还会启动一个后台管理端,提供了远程对话、查看修改配置、查看 log 等能力。
- 默认地址:http://localhost:5001
- 默认账户名:wukong
- 默认密码:wukong@2019
建议正式使用时修改用户名和密码,以免泄漏隐私。
## 配置 ##
参考[配置文件的注释](https://github.com/wzpan/wukong-robot/blob/master/static/default.yml)进行配置即可。注意不建议直接修改 default.yml 里的内容,否则会给后续通过 `git pull` 更新带来麻烦。你应该拷贝一份放到 `$HOME/.wukong/config.yml` 中,或者在运行的时候按照提示让 wukong-robot 为你完成这件事。
> tips:不论使用哪个厂商的API,都建议注册并填上自己注册的应用信息,而不要用默认的配置。这是因为这些API都有使用频率和并发数限制,过多人同时使用会影响服务质量。
## 技能插件 ##
* [官方插件列表](https://wukong.hahack.com/#/official)
* [用户贡献插件](https://wukong.hahack.com/#/contrib)
## API 接口 ##
wukong-robot 的后台接口是开放 Web API 的,可以使用 Restful 方式调用,见 [后台API](https://wukong.hahack.com/#/api)。
## 捐赠
您的捐赠将鼓励我继续完善 wukong-robot。
* 对于个人用户,可以使用支付宝或者微信进行捐赠,单笔超过 100 元的捐赠者,您的 ID 将可以出现在 wukong-robot 后台管理端的捐赠页面中。
| 支付宝 | 微信支付 |
| ------ | --------- |
| <img src="http://hahack.com/images/misc/alipay.png" height="248px" width="164px" title="支付宝" style="display:inherit;"/> | <img src="http://hahack.com/images/misc/wechatpay.jpeg" height="248px" width="164px" title="微信支付" style="display:inherit;"/> |
如果以上的图裂了,可以下载图片([支付宝](http://hahack.com/images/misc/alipay.png) | [微信](http://hahack.com/images/misc/wechatpay.jpeg))到本地进行扫描。
* 对于企业用户,建议[成为这个项目的 backer](https://opencollective.com/wukong-robot/contribute/tier/8131-sponsor),您将可以把一个带链接的 logo 放在 wukong-robot 后台管理端的首页、捐赠页面以及 Github 项目首页中。
<p>
<a href="https://opencollective.com/wukong-robot/sponsor/0/website" target="_blank"><img src="https://opencollective.com/wukong-robot/sponsor/0/avatar.svg"></a>
<a href="https://opencollective.com/wukong-robot/sponsor/1/website" target="_blank"><img src="https://opencollective.com/wukong-robot/sponsor/1/avatar.svg"></a>
<a href="https://opencollective.com/wukong-robot/sponsor/2/website" target="_blank"><img src="https://opencollective.com/wukong-robot/sponsor/2/avatar.svg"></a>
<a href="https://opencollective.com/wukong-robot/sponsor/3/website" target="_blank"><img src="https://opencollective.com/wukong-robot/sponsor/3/avatar.svg"></a>
<a href="https://opencollective.com/wukong-robot/sponsor/4/website" target="_blank"><img src="https://opencollective.com/wukong-robot/sponsor/4/avatar.svg"></a>
<a href="https://opencollective.com/wukong-robot/sponsor/5/website" target="_blank"><img src="https://opencollective.com/wukong-robot/sponsor/5/avatar.svg"></a>
<a href="https://opencollective.com/wukong-robot/sponsor/6/website" target="_blank"><img src="https://opencollective.com/wukong-robot/sponsor/6/avatar.svg"></a>
<a href="https://opencollective.com/wukong-robot/sponsor/7/website" target="_blank"><img src="https://opencollective.com/wukong-robot/sponsor/7/avatar.svg"></a>
<a href="https://opencollective.com/wukong-robot/sponsor/8/website" target="_blank"><img src="https://opencollective.com/wukong-robot/sponsor/8/avatar.svg"></a>
<a href="https://opencollective.com/wukong-robot/sponsor/9/website" target="_blank"><img src="https://opencollective.com/wukong-robot/sponsor/9/avatar.svg"></a>
</p>
## 贡献
* 喜欢本项目请先打一颗星;
* 提 bug 请到 [issue 页面](https://github.com/wzpan/wukong-robot/issues);
* 要贡献代码,欢迎 fork 之后再提 pull request;
* 插件请提交到 [wukong-contrib](https://github.com/wzpan/wukong-contrib) ;
## 引用
如果使用本项目的代码或插件,请引用本项目。
```
@misc{wukong-robot,
author = {潘伟洲},
title = {wukong-robot,一个简单、灵活、优雅的中文语音对话机器人/智能音箱项目},
year = {2019},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://github.com/wzpan/wukong-robot}},
}
```
## 联系
* wukong-robot 的主要开发者是 [潘伟洲](http://hahack.com) 。
* QQ 频道(推荐):
使用 QQ 扫码加入:

* QQ 群:580447290(人数将满,为控制人数,需付费20元入群。微信或支付宝支付后,申请入群时贴上转账单号即可。**群收入的前一万元已无偿捐赠给[壹基金等公益项目](https://hahack-1253537070.cos.ap-chengdu.myqcloud.com/images/donate.png)**)。
| 支付宝 | 微信支付 |
| ------ | --------- |
| <img src="http://hahack.com/images/misc/alipay.png" height="248px" width="164px" title="支付宝" style="display:inherit;"/> | <img src="http://hahack.com/images/misc/wechatpay.jpeg" height="248px" width="164px" title="微信支付" style="display:inherit;"/> |
如果以上的图裂了,可以下载图片([支付宝](http://hahack.com/images/misc/alipay.png) | [微信](http://hahack.com/images/misc/wechatpay.jpeg))到本地进行扫描。
## 感谢
* 悟空的前身是 [dingdang-robot](https://github.com/dingdang-robot/dingdang-robot) 项目和 [jasper-client](https://github.com/jasperproject/jasper-client) 项目。感谢 [Shubhro Saha](http://www.shubhro.com/), [Charles Marsh](http://www.crmarsh.com/) and [Jan Holthuis](http://homepage.ruhr-uni-bochum.de/Jan.Holthuis/) 在 Jasper 项目上做出的优秀贡献;
* 感谢三咲智子提供了备选的后台管理端 Demo 体验地址。
* 感谢 aliciacai 贡献的 wukong-robot 图标。
* 感谢所有为[本项目](https://github.com/wzpan/wukong-robot/graphs/contributors)、 [wukong-contrib](https://github.com/wzpan/wukong-contrib/graphs/contributors) 项目以及[dingdang-robot](https://github.com/dingdang-robot/dingdang-robot/graphs/contributors) 项目做出过贡献的人!
## Star 历史
[](https://star-history.com/#wzpan/wukong-robot&Date)
## 免责声明
* wukong-robot 只用作个人学习研究,如因使用 wukong-robot 导致任何损失,本人概不负责。
* 本开源项目与腾讯叮当助手及优必选悟空项目没有任何关系。
================================================
FILE: VERSION
================================================
3.5.3
================================================
FILE: docker/Dockerfile
================================================
# 使用官方 Python 3.8 基础镜像
FROM python:3.8-slim
# 设置工作目录
WORKDIR /app
# 安装依赖库
RUN apt-get update && apt-get install -y \
git \
portaudio19-dev \
python3-pyaudio \
sox \
pulseaudio \
libsox-fmt-all \
ffmpeg \
wget \
swig \
libpcre3 \
libpcre3-dev \
libatlas-base-dev \
build-essential \
&& rm -rf /var/lib/apt/lists/*
# 克隆项目仓库
RUN git clone https://github.com/wzpan/wukong-robot.git .
# 安装 PyAudio
RUN pip install pyaudio
# 安装 Python 依赖
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# 安装 wukong-contrib
RUN mkdir -p $HOME/.wukong \
&& cd $HOME/.wukong \
&& git clone http://github.com/wzpan/wukong-contrib.git contrib \
&& pip install -r contrib/requirements.txt
# 下载并编译 snowboy
RUN wget https://wzpan-1253537070.cos.ap-guangzhou.myqcloud.com/misc/snowboy.tar.bz2 \
&& tar -xvjf snowboy.tar.bz2 \
&& cd snowboy/swig/Python3 \
&& make \
&& cp _snowboydetect.so /app/snowboy/
# 暴露端口
EXPOSE 5001
# 设置 ENTRYPOINT
ENTRYPOINT ["python", "wukong.py"]
================================================
FILE: docker/DockerfileArm
================================================
# 使用官方 Python 3.8 基于 ARM 的镜像
FROM arm32v7/python:3.8-slim
MAINTAINER wzpan
# 设置工作目录
WORKDIR /app
# 安装依赖库
RUN apt-get update && apt-get install -y \
git \
portaudio19-dev \
python3-pyaudio \
sox \
pulseaudio \
libsox-fmt-all \
ffmpeg \
wget \
swig \
libpcre3 \
libpcre3-dev \
libatlas-base-dev \
libffi-dev \
build-essential \
&& rm -rf /var/lib/apt/lists/*
# 克隆项目仓库
RUN git clone https://github.com/wzpan/wukong-robot.git .
# 安装 PyAudio
RUN pip install pyaudio
# 安装 Python 依赖
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# 安装 wukong-contrib
RUN mkdir -p $HOME/.wukong \
&& cd $HOME/.wukong \
&& git clone http://github.com/wzpan/wukong-contrib.git contrib \
&& pip install -r contrib/requirements.txt
# 下载并编译 snowboy
RUN wget https://wzpan-1253537070.cos.ap-guangzhou.myqcloud.com/misc/snowboy.tar.bz2 \
&& tar -xvjf snowboy.tar.bz2 \
&& cd snowboy/swig/Python3 \
&& make \
&& cp _snowboydetect.so /app/snowboy/
# 暴露端口
EXPOSE 5001
# 设置 ENTRYPOINT
ENTRYPOINT ["python", "wukong.py"]
================================================
FILE: docs/.buildinfo
================================================
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: bed81550a26bd552fac818a5876d05a1
tags: 645f666f9bcd5a90fca523b33c5a78b7
================================================
FILE: docs/.nojekyll
================================================
================================================
FILE: docs/AI.html
================================================
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="zh-CN" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="zh-CN" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AI module — wukong-robot 1.2.0 文档</title>
<script type="text/javascript" src="_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/language_data.js"></script>
<script type="text/javascript" src="_static/translations.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="index" title="索引" href="genindex.html" />
<link rel="search" title="搜索" href="search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home"> wukong-robot
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<!-- Local TOC -->
<div class="local-toc"><ul>
<li><a class="reference internal" href="#">AI module</a></li>
</ul>
</div>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">wukong-robot</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="index.html">Docs</a> »</li>
<li>AI module</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/AI.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="ai-module">
<h1>AI module<a class="headerlink" href="#ai-module" title="永久链接至标题">¶</a></h1>
</div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
© Copyright 2019, wzpan
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>
================================================
FILE: docs/ASR.html
================================================
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="zh-CN" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="zh-CN" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ASR module — wukong-robot 1.2.0 文档</title>
<script type="text/javascript" src="_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/language_data.js"></script>
<script type="text/javascript" src="_static/translations.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="index" title="索引" href="genindex.html" />
<link rel="search" title="搜索" href="search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home"> wukong-robot
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<!-- Local TOC -->
<div class="local-toc"><ul>
<li><a class="reference internal" href="#">ASR module</a></li>
</ul>
</div>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">wukong-robot</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="index.html">Docs</a> »</li>
<li>ASR module</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/ASR.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="asr-module">
<h1>ASR module<a class="headerlink" href="#asr-module" title="永久链接至标题">¶</a></h1>
</div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
© Copyright 2019, wzpan
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>
================================================
FILE: docs/Brain.html
================================================
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="zh-CN" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="zh-CN" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Brain module — wukong-robot 1.2.0 文档</title>
<script type="text/javascript" src="_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/language_data.js"></script>
<script type="text/javascript" src="_static/translations.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="index" title="索引" href="genindex.html" />
<link rel="search" title="搜索" href="search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home"> wukong-robot
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<!-- Local TOC -->
<div class="local-toc"><ul>
<li><a class="reference internal" href="#">Brain module</a></li>
</ul>
</div>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">wukong-robot</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="index.html">Docs</a> »</li>
<li>Brain module</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/Brain.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="brain-module">
<h1>Brain module<a class="headerlink" href="#brain-module" title="永久链接至标题">¶</a></h1>
</div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
© Copyright 2019, wzpan
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>
================================================
FILE: docs/ConfigMonitor.html
================================================
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="zh-CN" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="zh-CN" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ConfigMonitor module — wukong-robot 1.2.0 文档</title>
<script type="text/javascript" src="_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/language_data.js"></script>
<script type="text/javascript" src="_static/translations.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="index" title="索引" href="genindex.html" />
<link rel="search" title="搜索" href="search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home"> wukong-robot
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<!-- Local TOC -->
<div class="local-toc"><ul>
<li><a class="reference internal" href="#">ConfigMonitor module</a></li>
</ul>
</div>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">wukong-robot</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="index.html">Docs</a> »</li>
<li>ConfigMonitor module</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/ConfigMonitor.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="configmonitor-module">
<h1>ConfigMonitor module<a class="headerlink" href="#configmonitor-module" title="永久链接至标题">¶</a></h1>
</div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
© Copyright 2019, wzpan
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>
================================================
FILE: docs/Conversation.html
================================================
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="zh-CN" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="zh-CN" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Conversation module — wukong-robot 1.2.0 文档</title>
<script type="text/javascript" src="_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/language_data.js"></script>
<script type="text/javascript" src="_static/translations.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="index" title="索引" href="genindex.html" />
<link rel="search" title="搜索" href="search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home"> wukong-robot
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<!-- Local TOC -->
<div class="local-toc"><ul>
<li><a class="reference internal" href="#">Conversation module</a></li>
</ul>
</div>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">wukong-robot</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="index.html">Docs</a> »</li>
<li>Conversation module</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/Conversation.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="conversation-module">
<h1>Conversation module<a class="headerlink" href="#conversation-module" title="永久链接至标题">¶</a></h1>
</div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
© Copyright 2019, wzpan
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>
================================================
FILE: docs/Player.html
================================================
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="zh-CN" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="zh-CN" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Player module — wukong-robot 1.2.0 文档</title>
<script type="text/javascript" src="_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/language_data.js"></script>
<script type="text/javascript" src="_static/translations.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="index" title="索引" href="genindex.html" />
<link rel="search" title="搜索" href="search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home"> wukong-robot
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<!-- Local TOC -->
<div class="local-toc"><ul>
<li><a class="reference internal" href="#">Player module</a></li>
</ul>
</div>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">wukong-robot</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="index.html">Docs</a> »</li>
<li>Player module</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/Player.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="player-module">
<h1>Player module<a class="headerlink" href="#player-module" title="永久链接至标题">¶</a></h1>
</div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
© Copyright 2019, wzpan
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>
================================================
FILE: docs/TTS.html
================================================
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="zh-CN" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="zh-CN" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>TTS module — wukong-robot 1.2.0 文档</title>
<script type="text/javascript" src="_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/language_data.js"></script>
<script type="text/javascript" src="_static/translations.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="index" title="索引" href="genindex.html" />
<link rel="search" title="搜索" href="search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home"> wukong-robot
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<!-- Local TOC -->
<div class="local-toc"><ul>
<li><a class="reference internal" href="#">TTS module</a></li>
</ul>
</div>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">wukong-robot</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="index.html">Docs</a> »</li>
<li>TTS module</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/TTS.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="tts-module">
<h1>TTS module<a class="headerlink" href="#tts-module" title="永久链接至标题">¶</a></h1>
</div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
© Copyright 2019, wzpan
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>
================================================
FILE: docs/Updater.html
================================================
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="zh-CN" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="zh-CN" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Updater module — wukong-robot 1.2.0 文档</title>
<script type="text/javascript" src="_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/language_data.js"></script>
<script type="text/javascript" src="_static/translations.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="index" title="索引" href="genindex.html" />
<link rel="search" title="搜索" href="search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home"> wukong-robot
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<!-- Local TOC -->
<div class="local-toc"><ul>
<li><a class="reference internal" href="#">Updater module</a></li>
</ul>
</div>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">wukong-robot</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="index.html">Docs</a> »</li>
<li>Updater module</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/Updater.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="updater-module">
<h1>Updater module<a class="headerlink" href="#updater-module" title="永久链接至标题">¶</a></h1>
</div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
© Copyright 2019, wzpan
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>
================================================
FILE: docs/_modules/index.html
================================================
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="zh-CN" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="zh-CN" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>概览:模块代码 — wukong-robot 1.2.0 文档</title>
<script type="text/javascript" src="../_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script type="text/javascript" src="../_static/jquery.js"></script>
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<script type="text/javascript" src="../_static/language_data.js"></script>
<script type="text/javascript" src="../_static/translations.js"></script>
<script type="text/javascript" src="../_static/js/theme.js"></script>
<link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="index" title="索引" href="../genindex.html" />
<link rel="search" title="搜索" href="../search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../index.html" class="icon icon-home"> wukong-robot
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<!-- Local TOC -->
<div class="local-toc"></div>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../index.html">wukong-robot</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../index.html">Docs</a> »</li>
<li>概览:模块代码</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1>代码可用的所有模块</h1>
<ul><li><a href="plugins/Camera.html">plugins.Camera</a></li>
<li><a href="plugins/CleanCache.html">plugins.CleanCache</a></li>
<li><a href="plugins/Echo.html">plugins.Echo</a></li>
<li><a href="plugins/Email.html">plugins.Email</a></li>
<li><a href="plugins/Geek.html">plugins.Geek</a></li>
<li><a href="plugins/LocalPlayer.html">plugins.LocalPlayer</a></li>
<li><a href="plugins/Poem.html">plugins.Poem</a></li>
<li><a href="robot/AI.html">robot.AI</a></li>
<li><a href="robot/ASR.html">robot.ASR</a></li>
<li><a href="robot/Brain.html">robot.Brain</a></li>
<li><a href="robot/ConfigMonitor.html">robot.ConfigMonitor</a></li>
<li><a href="robot/Conversation.html">robot.Conversation</a></li>
<li><a href="robot/NLU.html">robot.NLU</a></li>
<li><a href="robot/Player.html">robot.Player</a></li>
<li><a href="robot/TTS.html">robot.TTS</a></li>
<li><a href="robot/Updater.html">robot.Updater</a></li>
<li><a href="robot/config.html">robot.config</a></li>
<li><a href="robot/constants.html">robot.constants</a></li>
<li><a href="robot/logging.html">robot.logging</a></li>
<li><a href="robot/plugin_loader.html">robot.plugin_loader</a></li>
<li><a href="robot/sdk/AbstractPlugin.html">robot.sdk.AbstractPlugin</a></li>
<li><a href="robot/sdk/AliSpeech.html">robot.sdk.AliSpeech</a></li>
<li><a href="robot/sdk/RASRsdk.html">robot.sdk.RASRsdk</a></li>
<li><a href="robot/sdk/TencentSpeech.html">robot.sdk.TencentSpeech</a></li>
<li><a href="robot/sdk/XunfeiSpeech.html">robot.sdk.XunfeiSpeech</a></li>
<li><a href="robot/sdk/unit.html">robot.sdk.unit</a></li>
<li><a href="robot/statistic.html">robot.statistic</a></li>
<li><a href="robot/utils.html">robot.utils</a></li>
<li><a href="snowboy/snowboydecoder.html">snowboy.snowboydecoder</a></li>
<li><a href="snowboy/snowboydetect.html">snowboy.snowboydetect</a></li>
<li><a href="wukong.html">wukong</a></li>
</ul>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
© Copyright 2019, wzpan
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>
================================================
FILE: docs/_modules/logging.html
================================================
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="zh-CN" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="zh-CN" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>logging — wukong-robot 1.2.0 文档</title>
<script type="text/javascript" src="../_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script type="text/javascript" src="../_static/jquery.js"></script>
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<script type="text/javascript" src="../_static/language_data.js"></script>
<script type="text/javascript" src="../_static/translations.js"></script>
<script type="text/javascript" src="../_static/js/theme.js"></script>
<link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="index" title="索引" href="../genindex.html" />
<link rel="search" title="搜索" href="../search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../index.html" class="icon icon-home"> wukong-robot
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<!-- Local TOC -->
<div class="local-toc"></div>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../index.html">wukong-robot</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../index.html">Docs</a> »</li>
<li><a href="index.html">模块代码</a> »</li>
<li>logging</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1>logging 源代码</h1><div class="highlight"><pre>
<span></span><span class="c1"># Copyright 2001-2016 by Vinay Sajip. All Rights Reserved.</span>
<span class="c1">#</span>
<span class="c1"># Permission to use, copy, modify, and distribute this software and its</span>
<span class="c1"># documentation for any purpose and without fee is hereby granted,</span>
<span class="c1"># provided that the above copyright notice appear in all copies and that</span>
<span class="c1"># both that copyright notice and this permission notice appear in</span>
<span class="c1"># supporting documentation, and that the name of Vinay Sajip</span>
<span class="c1"># not be used in advertising or publicity pertaining to distribution</span>
<span class="c1"># of the software without specific, written prior permission.</span>
<span class="c1"># VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING</span>
<span class="c1"># ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL</span>
<span class="c1"># VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR</span>
<span class="c1"># ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER</span>
<span class="c1"># IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT</span>
<span class="c1"># OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.</span>
<span class="sd">"""</span>
<span class="sd">Logging package for Python. Based on PEP 282 and comments thereto in</span>
<span class="sd">comp.lang.python.</span>
<span class="sd">Copyright (C) 2001-2016 Vinay Sajip. All Rights Reserved.</span>
<span class="sd">To use, simply 'import logging' and log away!</span>
<span class="sd">"""</span>
<span class="kn">import</span> <span class="nn">sys</span><span class="o">,</span> <span class="nn">os</span><span class="o">,</span> <span class="nn">time</span><span class="o">,</span> <span class="nn">io</span><span class="o">,</span> <span class="nn">traceback</span><span class="o">,</span> <span class="nn">warnings</span><span class="o">,</span> <span class="nn">weakref</span><span class="o">,</span> <span class="nn">collections</span>
<span class="kn">from</span> <span class="nn">string</span> <span class="k">import</span> <span class="n">Template</span>
<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'BASIC_FORMAT'</span><span class="p">,</span> <span class="s1">'BufferingFormatter'</span><span class="p">,</span> <span class="s1">'CRITICAL'</span><span class="p">,</span> <span class="s1">'DEBUG'</span><span class="p">,</span> <span class="s1">'ERROR'</span><span class="p">,</span>
<span class="s1">'FATAL'</span><span class="p">,</span> <span class="s1">'FileHandler'</span><span class="p">,</span> <span class="s1">'Filter'</span><span class="p">,</span> <span class="s1">'Formatter'</span><span class="p">,</span> <span class="s1">'Handler'</span><span class="p">,</span> <span class="s1">'INFO'</span><span class="p">,</span>
<span class="s1">'LogRecord'</span><span class="p">,</span> <span class="s1">'Logger'</span><span class="p">,</span> <span class="s1">'LoggerAdapter'</span><span class="p">,</span> <span class="s1">'NOTSET'</span><span class="p">,</span> <span class="s1">'NullHandler'</span><span class="p">,</span>
<span class="s1">'StreamHandler'</span><span class="p">,</span> <span class="s1">'WARN'</span><span class="p">,</span> <span class="s1">'WARNING'</span><span class="p">,</span> <span class="s1">'addLevelName'</span><span class="p">,</span> <span class="s1">'basicConfig'</span><span class="p">,</span>
<span class="s1">'captureWarnings'</span><span class="p">,</span> <span class="s1">'critical'</span><span class="p">,</span> <span class="s1">'debug'</span><span class="p">,</span> <span class="s1">'disable'</span><span class="p">,</span> <span class="s1">'error'</span><span class="p">,</span>
<span class="s1">'exception'</span><span class="p">,</span> <span class="s1">'fatal'</span><span class="p">,</span> <span class="s1">'getLevelName'</span><span class="p">,</span> <span class="s1">'getLogger'</span><span class="p">,</span> <span class="s1">'getLoggerClass'</span><span class="p">,</span>
<span class="s1">'info'</span><span class="p">,</span> <span class="s1">'log'</span><span class="p">,</span> <span class="s1">'makeLogRecord'</span><span class="p">,</span> <span class="s1">'setLoggerClass'</span><span class="p">,</span> <span class="s1">'warn'</span><span class="p">,</span> <span class="s1">'warning'</span><span class="p">,</span>
<span class="s1">'getLogRecordFactory'</span><span class="p">,</span> <span class="s1">'setLogRecordFactory'</span><span class="p">,</span> <span class="s1">'lastResort'</span><span class="p">]</span>
<span class="k">try</span><span class="p">:</span>
<span class="kn">import</span> <span class="nn">threading</span>
<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span> <span class="c1">#pragma: no cover</span>
<span class="n">threading</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">__author__</span> <span class="o">=</span> <span class="s2">"Vinay Sajip <vinay_sajip@red-dove.com>"</span>
<span class="n">__status__</span> <span class="o">=</span> <span class="s2">"production"</span>
<span class="c1"># The following module attributes are no longer updated.</span>
<span class="n">__version__</span> <span class="o">=</span> <span class="s2">"0.5.1.2"</span>
<span class="n">__date__</span> <span class="o">=</span> <span class="s2">"07 February 2010"</span>
<span class="c1">#---------------------------------------------------------------------------</span>
<span class="c1"># Miscellaneous module data</span>
<span class="c1">#---------------------------------------------------------------------------</span>
<span class="c1">#</span>
<span class="c1">#_startTime is used as the base when calculating the relative time of events</span>
<span class="c1">#</span>
<span class="n">_startTime</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
<span class="c1">#</span>
<span class="c1">#raiseExceptions is used to see if exceptions during handling should be</span>
<span class="c1">#propagated</span>
<span class="c1">#</span>
<span class="n">raiseExceptions</span> <span class="o">=</span> <span class="kc">True</span>
<span class="c1">#</span>
<span class="c1"># If you don't want threading information in the log, set this to zero</span>
<span class="c1">#</span>
<span class="n">logThreads</span> <span class="o">=</span> <span class="kc">True</span>
<span class="c1">#</span>
<span class="c1"># If you don't want multiprocessing information in the log, set this to zero</span>
<span class="c1">#</span>
<span class="n">logMultiprocessing</span> <span class="o">=</span> <span class="kc">True</span>
<span class="c1">#</span>
<span class="c1"># If you don't want process information in the log, set this to zero</span>
<span class="c1">#</span>
<span class="n">logProcesses</span> <span class="o">=</span> <span class="kc">True</span>
<span class="c1">#---------------------------------------------------------------------------</span>
<span class="c1"># Level related stuff</span>
<span class="c1">#---------------------------------------------------------------------------</span>
<span class="c1">#</span>
<span class="c1"># Default levels and level names, these can be replaced with any positive set</span>
<span class="c1"># of values having corresponding names. There is a pseudo-level, NOTSET, which</span>
<span class="c1"># is only really there as a lower limit for user-defined levels. Handlers and</span>
<span class="c1"># loggers are initialized with NOTSET so that they will log all messages, even</span>
<span class="c1"># at user-defined levels.</span>
<span class="c1">#</span>
<span class="n">CRITICAL</span> <span class="o">=</span> <span class="mi">50</span>
<span class="n">FATAL</span> <span class="o">=</span> <span class="n">CRITICAL</span>
<span class="n">ERROR</span> <span class="o">=</span> <span class="mi">40</span>
<span class="n">WARNING</span> <span class="o">=</span> <span class="mi">30</span>
<span class="n">WARN</span> <span class="o">=</span> <span class="n">WARNING</span>
<span class="n">INFO</span> <span class="o">=</span> <span class="mi">20</span>
<span class="n">DEBUG</span> <span class="o">=</span> <span class="mi">10</span>
<span class="n">NOTSET</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">_levelToName</span> <span class="o">=</span> <span class="p">{</span>
<span class="n">CRITICAL</span><span class="p">:</span> <span class="s1">'CRITICAL'</span><span class="p">,</span>
<span class="n">ERROR</span><span class="p">:</span> <span class="s1">'ERROR'</span><span class="p">,</span>
<span class="n">WARNING</span><span class="p">:</span> <span class="s1">'WARNING'</span><span class="p">,</span>
<span class="n">INFO</span><span class="p">:</span> <span class="s1">'INFO'</span><span class="p">,</span>
<span class="n">DEBUG</span><span class="p">:</span> <span class="s1">'DEBUG'</span><span class="p">,</span>
<span class="n">NOTSET</span><span class="p">:</span> <span class="s1">'NOTSET'</span><span class="p">,</span>
<span class="p">}</span>
<span class="n">_nameToLevel</span> <span class="o">=</span> <span class="p">{</span>
<span class="s1">'CRITICAL'</span><span class="p">:</span> <span class="n">CRITICAL</span><span class="p">,</span>
<span class="s1">'ERROR'</span><span class="p">:</span> <span class="n">ERROR</span><span class="p">,</span>
<span class="s1">'WARN'</span><span class="p">:</span> <span class="n">WARNING</span><span class="p">,</span>
<span class="s1">'WARNING'</span><span class="p">:</span> <span class="n">WARNING</span><span class="p">,</span>
<span class="s1">'INFO'</span><span class="p">:</span> <span class="n">INFO</span><span class="p">,</span>
<span class="s1">'DEBUG'</span><span class="p">:</span> <span class="n">DEBUG</span><span class="p">,</span>
<span class="s1">'NOTSET'</span><span class="p">:</span> <span class="n">NOTSET</span><span class="p">,</span>
<span class="p">}</span>
<div class="viewcode-block" id="getLevelName"><a class="viewcode-back" href="../logging.html#logging.getLevelName">[文档]</a><span class="k">def</span> <span class="nf">getLevelName</span><span class="p">(</span><span class="n">level</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Return the textual representation of logging level 'level'.</span>
<span class="sd"> If the level is one of the predefined levels (CRITICAL, ERROR, WARNING,</span>
<span class="sd"> INFO, DEBUG) then you get the corresponding string. If you have</span>
<span class="sd"> associated levels with names using addLevelName then the name you have</span>
<span class="sd"> associated with 'level' is returned.</span>
<span class="sd"> If a numeric value corresponding to one of the defined levels is passed</span>
<span class="sd"> in, the corresponding string representation is returned.</span>
<span class="sd"> Otherwise, the string "Level %s" % level is returned.</span>
<span class="sd"> """</span>
<span class="c1"># See Issues #22386 and #27937 for why it's this way</span>
<span class="k">return</span> <span class="p">(</span><span class="n">_levelToName</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">level</span><span class="p">)</span> <span class="ow">or</span> <span class="n">_nameToLevel</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">level</span><span class="p">)</span> <span class="ow">or</span>
<span class="s2">"Level </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="n">level</span><span class="p">)</span></div>
<div class="viewcode-block" id="addLevelName"><a class="viewcode-back" href="../logging.html#logging.addLevelName">[文档]</a><span class="k">def</span> <span class="nf">addLevelName</span><span class="p">(</span><span class="n">level</span><span class="p">,</span> <span class="n">levelName</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Associate 'levelName' with 'level'.</span>
<span class="sd"> This is used when converting levels to text during message formatting.</span>
<span class="sd"> """</span>
<span class="n">_acquireLock</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span> <span class="c1">#unlikely to cause an exception, but you never know...</span>
<span class="n">_levelToName</span><span class="p">[</span><span class="n">level</span><span class="p">]</span> <span class="o">=</span> <span class="n">levelName</span>
<span class="n">_nameToLevel</span><span class="p">[</span><span class="n">levelName</span><span class="p">]</span> <span class="o">=</span> <span class="n">level</span>
<span class="k">finally</span><span class="p">:</span>
<span class="n">_releaseLock</span><span class="p">()</span></div>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">sys</span><span class="p">,</span> <span class="s1">'_getframe'</span><span class="p">):</span>
<span class="n">currentframe</span> <span class="o">=</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">sys</span><span class="o">.</span><span class="n">_getframe</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span> <span class="c1">#pragma: no cover</span>
<span class="k">def</span> <span class="nf">currentframe</span><span class="p">():</span>
<span class="sd">"""Return the frame object for the caller's stack frame."""</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">Exception</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="k">return</span> <span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">()[</span><span class="mi">2</span><span class="p">]</span><span class="o">.</span><span class="n">tb_frame</span><span class="o">.</span><span class="n">f_back</span>
<span class="c1">#</span>
<span class="c1"># _srcfile is used when walking the stack to check when we've got the first</span>
<span class="c1"># caller stack frame, by skipping frames whose filename is that of this</span>
<span class="c1"># module's source. It therefore should contain the filename of this module's</span>
<span class="c1"># source file.</span>
<span class="c1">#</span>
<span class="c1"># Ordinarily we would use __file__ for this, but frozen modules don't always</span>
<span class="c1"># have __file__ set, for some reason (see Issue #21736). Thus, we get the</span>
<span class="c1"># filename from a handy code object from a function defined in this module.</span>
<span class="c1"># (There's no particular reason for picking addLevelName.)</span>
<span class="c1">#</span>
<span class="n">_srcfile</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">normcase</span><span class="p">(</span><span class="n">addLevelName</span><span class="o">.</span><span class="vm">__code__</span><span class="o">.</span><span class="n">co_filename</span><span class="p">)</span>
<span class="c1"># _srcfile is only used in conjunction with sys._getframe().</span>
<span class="c1"># To provide compatibility with older versions of Python, set _srcfile</span>
<span class="c1"># to None if _getframe() is not available; this value will prevent</span>
<span class="c1"># findCaller() from being called. You can also do this if you want to avoid</span>
<span class="c1"># the overhead of fetching caller information, even when _getframe() is</span>
<span class="c1"># available.</span>
<span class="c1">#if not hasattr(sys, '_getframe'):</span>
<span class="c1"># _srcfile = None</span>
<span class="k">def</span> <span class="nf">_checkLevel</span><span class="p">(</span><span class="n">level</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">level</span><span class="p">,</span> <span class="nb">int</span><span class="p">):</span>
<span class="n">rv</span> <span class="o">=</span> <span class="n">level</span>
<span class="k">elif</span> <span class="nb">str</span><span class="p">(</span><span class="n">level</span><span class="p">)</span> <span class="o">==</span> <span class="n">level</span><span class="p">:</span>
<span class="k">if</span> <span class="n">level</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">_nameToLevel</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Unknown level: </span><span class="si">%r</span><span class="s2">"</span> <span class="o">%</span> <span class="n">level</span><span class="p">)</span>
<span class="n">rv</span> <span class="o">=</span> <span class="n">_nameToLevel</span><span class="p">[</span><span class="n">level</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">"Level not an integer or a valid string: </span><span class="si">%r</span><span class="s2">"</span> <span class="o">%</span> <span class="n">level</span><span class="p">)</span>
<span class="k">return</span> <span class="n">rv</span>
<span class="c1">#---------------------------------------------------------------------------</span>
<span class="c1"># Thread-related stuff</span>
<span class="c1">#---------------------------------------------------------------------------</span>
<span class="c1">#</span>
<span class="c1">#_lock is used to serialize access to shared data structures in this module.</span>
<span class="c1">#This needs to be an RLock because fileConfig() creates and configures</span>
<span class="c1">#Handlers, and so might arbitrary user threads. Since Handler code updates the</span>
<span class="c1">#shared dictionary _handlers, it needs to acquire the lock. But if configuring,</span>
<span class="c1">#the lock would already have been acquired - so we need an RLock.</span>
<span class="c1">#The same argument applies to Loggers and Manager.loggerDict.</span>
<span class="c1">#</span>
<span class="k">if</span> <span class="n">threading</span><span class="p">:</span>
<span class="n">_lock</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">RLock</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span> <span class="c1">#pragma: no cover</span>
<span class="n">_lock</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">def</span> <span class="nf">_acquireLock</span><span class="p">():</span>
<span class="sd">"""</span>
<span class="sd"> Acquire the module-level lock for serializing access to shared data.</span>
<span class="sd"> This should be released with _releaseLock().</span>
<span class="sd"> """</span>
<span class="k">if</span> <span class="n">_lock</span><span class="p">:</span>
<span class="n">_lock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">_releaseLock</span><span class="p">():</span>
<span class="sd">"""</span>
<span class="sd"> Release the module-level lock acquired by calling _acquireLock().</span>
<span class="sd"> """</span>
<span class="k">if</span> <span class="n">_lock</span><span class="p">:</span>
<span class="n">_lock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
<span class="c1">#---------------------------------------------------------------------------</span>
<span class="c1"># The logging record</span>
<span class="c1">#---------------------------------------------------------------------------</span>
<div class="viewcode-block" id="LogRecord"><a class="viewcode-back" href="../logging.html#logging.LogRecord">[文档]</a><span class="k">class</span> <span class="nc">LogRecord</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> A LogRecord instance represents an event being logged.</span>
<span class="sd"> LogRecord instances are created every time something is logged. They</span>
<span class="sd"> contain all the information pertinent to the event being logged. The</span>
<span class="sd"> main information passed in is in msg and args, which are combined</span>
<span class="sd"> using str(msg) % args to create the message field of the record. The</span>
<span class="sd"> record also includes information such as when the record was created,</span>
<span class="sd"> the source line where the logging call was made, and any exception</span>
<span class="sd"> information to be logged.</span>
<span class="sd"> """</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">level</span><span class="p">,</span> <span class="n">pathname</span><span class="p">,</span> <span class="n">lineno</span><span class="p">,</span>
<span class="n">msg</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">exc_info</span><span class="p">,</span> <span class="n">func</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">sinfo</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Initialize a logging record with interesting information.</span>
<span class="sd"> """</span>
<span class="n">ct</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="o">=</span> <span class="n">msg</span>
<span class="c1">#</span>
<span class="c1"># The following statement allows passing of a dictionary as a sole</span>
<span class="c1"># argument, so that you can do something like</span>
<span class="c1"># logging.debug("a %(a)d b %(b)s", {'a':1, 'b':2})</span>
<span class="c1"># Suggested by Stefan Behnel.</span>
<span class="c1"># Note that without the test for args[0], we get a problem because</span>
<span class="c1"># during formatting, we test to see if the arg is present using</span>
<span class="c1"># 'if self.args:'. If the event being logged is e.g. 'Value is %d'</span>
<span class="c1"># and if the passed arg fails 'if self.args:' then no formatting</span>
<span class="c1"># is done. For example, logger.warning('Value is %d', 0) would log</span>
<span class="c1"># 'Value is %d' instead of 'Value is 0'.</span>
<span class="c1"># For the use case of passing a dictionary, this should not be a</span>
<span class="c1"># problem.</span>
<span class="c1"># Issue #21172: a request was made to relax the isinstance check</span>
<span class="c1"># to hasattr(args[0], '__getitem__'). However, the docs on string</span>
<span class="c1"># formatting still seem to suggest a mapping object is required.</span>
<span class="c1"># Thus, while not removing the isinstance check, it does now look</span>
<span class="c1"># for collections.Mapping rather than, as before, dict.</span>
<span class="k">if</span> <span class="p">(</span><span class="n">args</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">collections</span><span class="o">.</span><span class="n">Mapping</span><span class="p">)</span>
<span class="ow">and</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]):</span>
<span class="n">args</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">args</span> <span class="o">=</span> <span class="n">args</span>
<span class="bp">self</span><span class="o">.</span><span class="n">levelname</span> <span class="o">=</span> <span class="n">getLevelName</span><span class="p">(</span><span class="n">level</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">levelno</span> <span class="o">=</span> <span class="n">level</span>
<span class="bp">self</span><span class="o">.</span><span class="n">pathname</span> <span class="o">=</span> <span class="n">pathname</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">filename</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">basename</span><span class="p">(</span><span class="n">pathname</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">module</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">splitext</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">filename</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">TypeError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">,</span> <span class="ne">AttributeError</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">filename</span> <span class="o">=</span> <span class="n">pathname</span>
<span class="bp">self</span><span class="o">.</span><span class="n">module</span> <span class="o">=</span> <span class="s2">"Unknown module"</span>
<span class="bp">self</span><span class="o">.</span><span class="n">exc_info</span> <span class="o">=</span> <span class="n">exc_info</span>
<span class="bp">self</span><span class="o">.</span><span class="n">exc_text</span> <span class="o">=</span> <span class="kc">None</span> <span class="c1"># used to cache the traceback text</span>
<span class="bp">self</span><span class="o">.</span><span class="n">stack_info</span> <span class="o">=</span> <span class="n">sinfo</span>
<span class="bp">self</span><span class="o">.</span><span class="n">lineno</span> <span class="o">=</span> <span class="n">lineno</span>
<span class="bp">self</span><span class="o">.</span><span class="n">funcName</span> <span class="o">=</span> <span class="n">func</span>
<span class="bp">self</span><span class="o">.</span><span class="n">created</span> <span class="o">=</span> <span class="n">ct</span>
<span class="bp">self</span><span class="o">.</span><span class="n">msecs</span> <span class="o">=</span> <span class="p">(</span><span class="n">ct</span> <span class="o">-</span> <span class="nb">int</span><span class="p">(</span><span class="n">ct</span><span class="p">))</span> <span class="o">*</span> <span class="mi">1000</span>
<span class="bp">self</span><span class="o">.</span><span class="n">relativeCreated</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">created</span> <span class="o">-</span> <span class="n">_startTime</span><span class="p">)</span> <span class="o">*</span> <span class="mi">1000</span>
<span class="k">if</span> <span class="n">logThreads</span> <span class="ow">and</span> <span class="n">threading</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">thread</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">get_ident</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">threadName</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">current_thread</span><span class="p">()</span><span class="o">.</span><span class="n">name</span>
<span class="k">else</span><span class="p">:</span> <span class="c1"># pragma: no cover</span>
<span class="bp">self</span><span class="o">.</span><span class="n">thread</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">threadName</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">logMultiprocessing</span><span class="p">:</span> <span class="c1"># pragma: no cover</span>
<span class="bp">self</span><span class="o">.</span><span class="n">processName</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">processName</span> <span class="o">=</span> <span class="s1">'MainProcess'</span>
<span class="n">mp</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">modules</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'multiprocessing'</span><span class="p">)</span>
<span class="k">if</span> <span class="n">mp</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1"># Errors may occur if multiprocessing has not finished loading</span>
<span class="c1"># yet - e.g. if a custom import hook causes third-party code</span>
<span class="c1"># to run when multiprocessing calls import. See issue 8200</span>
<span class="c1"># for an example</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">processName</span> <span class="o">=</span> <span class="n">mp</span><span class="o">.</span><span class="n">current_process</span><span class="p">()</span><span class="o">.</span><span class="n">name</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span> <span class="c1">#pragma: no cover</span>
<span class="k">pass</span>
<span class="k">if</span> <span class="n">logProcesses</span> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">os</span><span class="p">,</span> <span class="s1">'getpid'</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">process</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">getpid</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">process</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s1">'<LogRecord: </span><span class="si">%s</span><span class="s1">, </span><span class="si">%s</span><span class="s1">, </span><span class="si">%s</span><span class="s1">, </span><span class="si">%s</span><span class="s1">, "</span><span class="si">%s</span><span class="s1">">'</span><span class="o">%</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">levelno</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">pathname</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">lineno</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">)</span>
<span class="fm">__repr__</span> <span class="o">=</span> <span class="fm">__str__</span>
<div class="viewcode-block" id="LogRecord.getMessage"><a class="viewcode-back" href="../logging.html#logging.LogRecord.getMessage">[文档]</a> <span class="k">def</span> <span class="nf">getMessage</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Return the message for this LogRecord.</span>
<span class="sd"> Return the message for this LogRecord after merging any user-supplied</span>
<span class="sd"> arguments with the message.</span>
<span class="sd"> """</span>
<span class="n">msg</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">msg</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span><span class="p">:</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">msg</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">args</span>
<span class="k">return</span> <span class="n">msg</span></div></div>
<span class="c1">#</span>
<span class="c1"># Determine which class to use when instantiating log records.</span>
<span class="c1">#</span>
<span class="n">_logRecordFactory</span> <span class="o">=</span> <span class="n">LogRecord</span>
<div class="viewcode-block" id="setLogRecordFactory"><a class="viewcode-back" href="../logging.html#logging.setLogRecordFactory">[文档]</a><span class="k">def</span> <span class="nf">setLogRecordFactory</span><span class="p">(</span><span class="n">factory</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Set the factory to be used when instantiating a log record.</span>
<span class="sd"> :param factory: A callable which will be called to instantiate</span>
<span class="sd"> a log record.</span>
<span class="sd"> """</span>
<span class="k">global</span> <span class="n">_logRecordFactory</span>
<span class="n">_logRecordFactory</span> <span class="o">=</span> <span class="n">factory</span></div>
<div class="viewcode-block" id="getLogRecordFactory"><a class="viewcode-back" href="../logging.html#logging.getLogRecordFactory">[文档]</a><span class="k">def</span> <span class="nf">getLogRecordFactory</span><span class="p">():</span>
<span class="sd">"""</span>
<span class="sd"> Return the factory to be used when instantiating a log record.</span>
<span class="sd"> """</span>
<span class="k">return</span> <span class="n">_logRecordFactory</span></div>
<div class="viewcode-block" id="makeLogRecord"><a class="viewcode-back" href="../logging.html#logging.makeLogRecord">[文档]</a><span class="k">def</span> <span class="nf">makeLogRecord</span><span class="p">(</span><span class="nb">dict</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Make a LogRecord whose attributes are defined by the specified dictionary,</span>
<span class="sd"> This function is useful for converting a logging event received over</span>
<span class="sd"> a socket connection (which is sent as a dictionary) into a LogRecord</span>
<span class="sd"> instance.</span>
<span class="sd"> """</span>
<span class="n">rv</span> <span class="o">=</span> <span class="n">_logRecordFactory</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="s2">""</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="s2">""</span><span class="p">,</span> <span class="p">(),</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="n">rv</span><span class="o">.</span><span class="vm">__dict__</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="nb">dict</span><span class="p">)</span>
<span class="k">return</span> <span class="n">rv</span></div>
<span class="c1">#---------------------------------------------------------------------------</span>
<span class="c1"># Formatter classes and functions</span>
<span class="c1">#---------------------------------------------------------------------------</span>
<span class="k">class</span> <span class="nc">PercentStyle</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="n">default_format</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%(message)s</span><span class="s1">'</span>
<span class="n">asctime_format</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%(asctime)s</span><span class="s1">'</span>
<span class="n">asctime_search</span> <span class="o">=</span> <span class="s1">'%(asctime)'</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fmt</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_fmt</span> <span class="o">=</span> <span class="n">fmt</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">default_format</span>
<span class="k">def</span> <span class="nf">usesTime</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fmt</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">asctime_search</span><span class="p">)</span> <span class="o">>=</span> <span class="mi">0</span>
<span class="k">def</span> <span class="nf">format</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">record</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fmt</span> <span class="o">%</span> <span class="n">record</span><span class="o">.</span><span class="vm">__dict__</span>
<span class="k">class</span> <span class="nc">StrFormatStyle</span><span class="p">(</span><span class="n">PercentStyle</span><span class="p">):</span>
<span class="n">default_format</span> <span class="o">=</span> <span class="s1">'</span><span class="si">{message}</span><span class="s1">'</span>
<span class="n">asctime_format</span> <span class="o">=</span> <span class="s1">'</span><span class="si">{asctime}</span><span class="s1">'</span>
<span class="n">asctime_search</span> <span class="o">=</span> <span class="s1">'{asctime'</span>
<span class="k">def</span> <span class="nf">format</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">record</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fmt</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">record</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">StringTemplateStyle</span><span class="p">(</span><span class="n">PercentStyle</span><span class="p">):</span>
<span class="n">default_format</span> <span class="o">=</span> <span class="s1">'$</span><span class="si">{message}</span><span class="s1">'</span>
<span class="n">asctime_format</span> <span class="o">=</span> <span class="s1">'$</span><span class="si">{asctime}</span><span class="s1">'</span>
<span class="n">asctime_search</span> <span class="o">=</span> <span class="s1">'$</span><span class="si">{asctime}</span><span class="s1">'</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fmt</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_fmt</span> <span class="o">=</span> <span class="n">fmt</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">default_format</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_tpl</span> <span class="o">=</span> <span class="n">Template</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_fmt</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">usesTime</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">fmt</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fmt</span>
<span class="k">return</span> <span class="n">fmt</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">'$asctime'</span><span class="p">)</span> <span class="o">>=</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">fmt</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">asctime_format</span><span class="p">)</span> <span class="o">>=</span> <span class="mi">0</span>
<span class="k">def</span> <span class="nf">format</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">record</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_tpl</span><span class="o">.</span><span class="n">substitute</span><span class="p">(</span><span class="o">**</span><span class="n">record</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">)</span>
<span class="n">BASIC_FORMAT</span> <span class="o">=</span> <span class="s2">"</span><span class="si">%(levelname)s</span><span class="s2">:</span><span class="si">%(name)s</span><span class="s2">:</span><span class="si">%(message)s</span><span class="s2">"</span>
<span class="n">_STYLES</span> <span class="o">=</span> <span class="p">{</span>
<span class="s1">'%'</span><span class="p">:</span> <span class="p">(</span><span class="n">PercentStyle</span><span class="p">,</span> <span class="n">BASIC_FORMAT</span><span class="p">),</span>
<span class="s1">'{'</span><span class="p">:</span> <span class="p">(</span><span class="n">StrFormatStyle</span><span class="p">,</span> <span class="s1">'</span><span class="si">{levelname}</span><span class="s1">:</span><span class="si">{name}</span><span class="s1">:</span><span class="si">{message}</span><span class="s1">'</span><span class="p">),</span>
<span class="s1">'$'</span><span class="p">:</span> <span class="p">(</span><span class="n">StringTemplateStyle</span><span class="p">,</span> <span class="s1">'$</span><span class="si">{levelname}</span><span class="s1">:$</span><span class="si">{name}</span><span class="s1">:$</span><span class="si">{message}</span><span class="s1">'</span><span class="p">),</span>
<span class="p">}</span>
<div class="viewcode-block" id="Formatter"><a class="viewcode-back" href="../logging.html#logging.Formatter">[文档]</a><span class="k">class</span> <span class="nc">Formatter</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Formatter instances are used to convert a LogRecord to text.</span>
<span class="sd"> Formatters need to know how a LogRecord is constructed. They are</span>
<span class="sd"> responsible for converting a LogRecord to (usually) a string which can</span>
<span class="sd"> be interpreted by either a human or an external system. The base Formatter</span>
<span class="sd"> allows a formatting string to be specified. If none is supplied, the</span>
<span class="sd"> default value of "%s(message)" is used.</span>
<span class="sd"> The Formatter can be initialized with a format string which makes use of</span>
<span class="sd"> knowledge of the LogRecord attributes - e.g. the default value mentioned</span>
<span class="sd"> above makes use of the fact that the user's message and arguments are pre-</span>
<span class="sd"> formatted into a LogRecord's message attribute. Currently, the useful</span>
<span class="sd"> attributes in a LogRecord are described by:</span>
<span class="sd"> %(name)s Name of the logger (logging channel)</span>
<span class="sd"> %(levelno)s Numeric logging level for the message (DEBUG, INFO,</span>
<span class="sd"> WARNING, ERROR, CRITICAL)</span>
<span class="sd"> %(levelname)s Text logging level for the message ("DEBUG", "INFO",</span>
<span class="sd"> "WARNING", "ERROR", "CRITICAL")</span>
<span class="sd"> %(pathname)s Full pathname of the source file where the logging</span>
<span class="sd"> call was issued (if available)</span>
<span class="sd"> %(filename)s Filename portion of pathname</span>
<span class="sd"> %(module)s Module (name portion of filename)</span>
<span class="sd"> %(lineno)d Source line number where the logging call was issued</span>
<span class="sd"> (if available)</span>
<span class="sd"> %(funcName)s Function name</span>
<span class="sd"> %(created)f Time when the LogRecord was created (time.time()</span>
<span class="sd"> return value)</span>
<span class="sd"> %(asctime)s Textual time when the LogRecord was created</span>
<span class="sd"> %(msecs)d Millisecond portion of the creation time</span>
<span class="sd"> %(relativeCreated)d Time in milliseconds when the LogRecord was created,</span>
<span class="sd"> relative to the time the logging module was loaded</span>
<span class="sd"> (typically at application startup time)</span>
<span class="sd"> %(thread)d Thread ID (if available)</span>
<span class="sd"> %(threadName)s Thread name (if available)</span>
<span class="sd"> %(process)d Process ID (if available)</span>
<span class="sd"> %(message)s The result of record.getMessage(), computed just as</span>
<span class="sd"> the record is emitted</span>
<span class="sd"> """</span>
<span class="n">converter</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">localtime</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fmt</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">datefmt</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">style</span><span class="o">=</span><span class="s1">'%'</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Initialize the formatter with specified format strings.</span>
<span class="sd"> Initialize the formatter either with the specified format string, or a</span>
<span class="sd"> default as described above. Allow for specialized date formatting with</span>
<span class="sd"> the optional datefmt argument (if omitted, you get the ISO8601 format).</span>
<span class="sd"> Use a style parameter of '%', '{' or '$' to specify that you want to</span>
<span class="sd"> use one of %-formatting, :meth:`str.format` (``{}``) formatting or</span>
<span class="sd"> :class:`string.Template` formatting in your format string.</span>
<span class="sd"> .. versionchanged:: 3.2</span>
<span class="sd"> Added the ``style`` parameter.</span>
<span class="sd"> """</span>
<span class="k">if</span> <span class="n">style</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">_STYLES</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'Style must be one of: </span><span class="si">%s</span><span class="s1">'</span> <span class="o">%</span> <span class="s1">','</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
<span class="n">_STYLES</span><span class="o">.</span><span class="n">keys</span><span class="p">()))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_style</span> <span class="o">=</span> <span class="n">_STYLES</span><span class="p">[</span><span class="n">style</span><span class="p">][</span><span class="mi">0</span><span class="p">](</span><span class="n">fmt</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_fmt</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_style</span><span class="o">.</span><span class="n">_fmt</span>
<span class="bp">self</span><span class="o">.</span><span class="n">datefmt</span> <span class="o">=</span> <span class="n">datefmt</span>
<span class="n">default_time_format</span> <span class="o">=</span> <span class="s1">'%Y-%m-</span><span class="si">%d</span><span class="s1"> %H:%M:%S'</span>
<span class="n">default_msec_format</span> <span class="o">=</span> <span class="s1">'</span><span class="si">%s</span><span class="s1">,</span><span class="si">%03d</span><span class="s1">'</span>
<div class="viewcode-block" id="Formatter.formatTime"><a class="viewcode-back" href="../logging.html#logging.Formatter.formatTime">[文档]</a> <span class="k">def</span> <span class="nf">formatTime</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">record</span><span class="p">,</span> <span class="n">datefmt</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Return the creation time of the specified LogRecord as formatted text.</span>
<span class="sd"> This method should be called from format() by a formatter which</span>
<span class="sd"> wants to make use of a formatted time. This method can be overridden</span>
<span class="sd"> in formatters to provide for any specific requirement, but the</span>
<span class="sd"> basic behaviour is as follows: if datefmt (a string) is specified,</span>
<span class="sd"> it is used with time.strftime() to format the creation time of the</span>
<span class="sd"> record. Otherwise, the ISO8601 format is used. The resulting</span>
<span class="sd"> string is returned. This function uses a user-configurable function</span>
<span class="sd"> to convert the creation time to a tuple. By default, time.localtime()</span>
<span class="sd"> is used; to change this for a particular formatter instance, set the</span>
<span class="sd"> 'converter' attribute to a function with the same signature as</span>
<span class="sd"> time.localtime() or time.gmtime(). To change it for all formatters,</span>
<span class="sd"> for example if you want all logging times to be shown in GMT,</span>
<span class="sd"> set the 'converter' attribute in the Formatter class.</span>
<span class="sd"> """</span>
<span class="n">ct</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">converter</span><span class="p">(</span><span class="n">record</span><span class="o">.</span><span class="n">created</span><span class="p">)</span>
<span class="k">if</span> <span class="n">datefmt</span><span class="p">:</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="n">datefmt</span><span class="p">,</span> <span class="n">ct</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">t</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">default_time_format</span><span class="p">,</span> <span class="n">ct</span><span class="p">)</span>
<span class="n">s</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">default_msec_format</span> <span class="o">%</span> <span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">record</span><span class="o">.</span><span class="n">msecs</span><span class="p">)</span>
<span class="k">return</span> <span class="n">s</span></div>
<div class="viewcode-block" id="Formatter.formatException"><a class="viewcode-back" href="../logging.html#logging.Formatter.formatException">[文档]</a> <span class="k">def</span> <span class="nf">formatException</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ei</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Format and return the specified exception information as a string.</span>
<span class="sd"> This default implementation just uses</span>
<span class="sd"> traceback.print_exception()</span>
<span class="sd"> """</span>
<span class="n">sio</span> <span class="o">=</span> <span class="n">io</span><span class="o">.</span><span class="n">StringIO</span><span class="p">()</span>
<span class="n">tb</span> <span class="o">=</span> <span class="n">ei</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
<span class="c1"># See issues #9427, #1553375. Commented out for now.</span>
<span class="c1">#if getattr(self, 'fullstack', False):</span>
<span class="c1"># traceback.print_stack(tb.tb_frame.f_back, file=sio)</span>
<span class="n">traceback</span><span class="o">.</span><span class="n">print_exception</span><span class="p">(</span><span class="n">ei</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">ei</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">tb</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="n">sio</span><span class="p">)</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">sio</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span>
<span class="n">sio</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">if</span> <span class="n">s</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">:]</span> <span class="o">==</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">:</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">s</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="k">return</span> <span class="n">s</span></div>
<div class="viewcode-block" id="Formatter.usesTime"><a class="viewcode-back" href="../logging.html#logging.Formatter.usesTime">[文档]</a> <span class="k">def</span> <span class="nf">usesTime</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Check if the format uses the creation time of the record.</span>
<span class="sd"> """</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_style</span><span class="o">.</span><span class="n">usesTime</span><span class="p">()</span></div>
<div class="viewcode-block" id="Formatter.formatMessage"><a class="viewcode-back" href="../logging.html#logging.Formatter.formatMessage">[文档]</a> <span class="k">def</span> <span class="nf">formatMessage</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">record</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_style</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">record</span><span class="p">)</span></div>
<div class="viewcode-block" id="Formatter.formatStack"><a class="viewcode-back" href="../logging.html#logging.Formatter.formatStack">[文档]</a> <span class="k">def</span> <span class="nf">formatStack</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stack_info</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> This method is provided as an extension point for specialized</span>
<span class="sd"> formatting of stack information.</span>
<span class="sd"> The input data is a string as returned from a call to</span>
<span class="sd"> :func:`traceback.print_stack`, but with the last trailing newline</span>
<span class="sd"> removed.</span>
<span class="sd"> The base implementation just returns the value passed in.</span>
<span class="sd"> """</span>
<span class="k">return</span> <span class="n">stack_info</span></div>
<div class="viewcode-block" id="Formatter.format"><a class="viewcode-back" href="../logging.html#logging.Formatter.format">[文档]</a> <span class="k">def</span> <span class="nf">format</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">record</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Format the specified record as text.</span>
<span class="sd"> The record's attribute dictionary is used as the operand to a</span>
<span class="sd"> string formatting operation which yields the returned string.</span>
<span class="sd"> Before formatting the dictionary, a couple of preparatory steps</span>
<span class="sd"> are carried out. The message attribute of the record is computed</span>
<span class="sd"> using LogRecord.getMessage(). If the formatting string uses the</span>
<span class="sd"> time (as determined by a call to usesTime(), formatTime() is</span>
<span class="sd"> called to format the event time. If there is exception information,</span>
<span class="sd"> it is formatted using formatException() and appended to the message.</span>
<span class="sd"> """</span>
<span class="n">record</span><span class="o">.</span><span class="n">message</span> <span class="o">=</span> <span class="n">record</span><span class="o">.</span><span class="n">getMessage</span><span class="p">()</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">usesTime</span><span class="p">():</span>
<span class="n">record</span><span class="o">.</span><span class="n">asctime</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">formatTime</span><span class="p">(</span><span class="n">record</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">datefmt</span><span class="p">)</span>
<span class="n">s</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">formatMessage</span><span class="p">(</span><span class="n">record</span><span class="p">)</span>
<span class="k">if</span> <span class="n">record</span><span class="o">.</span><span class="n">exc_info</span><span class="p">:</span>
<span class="c1"># Cache the traceback text to avoid converting it multiple times</span>
<span class="c1"># (it's constant anyway)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">record</span><span class="o">.</span><span class="n">exc_text</span><span class="p">:</span>
<span class="n">record</span><span class="o">.</span><span class="n">exc_text</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">formatException</span><span class="p">(</span><span class="n">record</span><span class="o">.</span><span class="n">exc_info</span><span class="p">)</span>
<span class="k">if</span> <span class="n">record</span><span class="o">.</span><span class="n">exc_text</span><span class="p">:</span>
<span class="k">if</span> <span class="n">s</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">:]</span> <span class="o">!=</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">:</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">s</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">s</span> <span class="o">+</span> <span class="n">record</span><span class="o">.</span><span class="n">exc_text</span>
<span class="k">if</span> <span class="n">record</span><span class="o">.</span><span class="n">stack_info</span><span class="p">:</span>
<span class="k">if</span> <span class="n">s</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">:]</span> <span class="o">!=</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">:</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">s</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">s</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">formatStack</span><span class="p">(</span><span class="n">record</span><span class="o">.</span><span class="n">stack_info</span><span class="p">)</span>
<span class="k">return</span> <span class="n">s</span></div></div>
<span class="c1">#</span>
<span class="c1"># The default formatter to use when no other is specified</span>
<span class="c1">#</span>
<span class="n">_defaultFormatter</span> <span class="o">=</span> <span class="n">Formatter</span><span class="p">()</span>
<div class="viewcode-block" id="BufferingFormatter"><a class="viewcode-back" href="../logging.html#logging.BufferingFormatter">[文档]</a><span class="k">class</span> <span class="nc">BufferingFormatter</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> A formatter suitable for formatting a number of records.</span>
<span class="sd"> """</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">linefmt</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Optionally specify a formatter which will be used to format each</span>
<span class="sd"> individual record.</span>
<span class="sd"> """</span>
<span class="k">if</span> <span class="n">linefmt</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">linefmt</span> <span class="o">=</span> <span class="n">linefmt</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">linefmt</span> <span class="o">=</span> <span class="n">_defaultFormatter</span>
<div class="viewcode-block" id="BufferingFormatter.formatHeader"><a class="viewcode-back" href="../logging.html#logging.BufferingFormatter.formatHeader">[文档]</a> <span class="k">def</span> <span class="nf">formatHeader</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">records</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Return the header string for the specified records.</span>
<span class="sd"> """</span>
<span class="k">return</span> <span class="s2">""</span></div>
<div class="viewcode-block" id="BufferingFormatter.formatFooter"><a class="viewcode-back" href="../logging.html#logging.BufferingFormatter.formatFooter">[文档]</a> <span class="k">def</span> <span class="nf">formatFooter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">records</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Return the footer string for the specified records.</span>
<span class="sd"> """</span>
<span class="k">return</span> <span class="s2">""</span></div>
<div class="viewcode-block" id="BufferingFormatter.format"><a class="viewcode-back" href="../logging.html#logging.BufferingFormatter.format">[文档]</a> <span class="k">def</span> <span class="nf">format</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">records</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Format the specified records and return the result as a string.</span>
<span class="sd"> """</span>
<span class="n">rv</span> <span class="o">=</span> <span class="s2">""</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">records</span><span class="p">)</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
<span class="n">rv</span> <span class="o">=</span> <span class="n">rv</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">formatHeader</span><span class="p">(</span><span class="n">records</span><span class="p">)</span>
<span class="k">for</span> <span class="n">record</span> <span class="ow">in</span> <span class="n">records</span><span class="p">:</span>
<span class="n">rv</span> <span class="o">=</span> <span class="n">rv</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">linefmt</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">record</span><span class="p">)</span>
<span class="n">rv</span> <span class="o">=</span> <span class="n">rv</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">formatFooter</span><span class="p">(</span><span class="n">records</span><span class="p">)</span>
<span class="k">return</span> <span class="n">rv</span></div></div>
<span class="c1">#---------------------------------------------------------------------------</span>
<span class="c1"># Filter classes and functions</span>
<span class="c1">#---------------------------------------------------------------------------</span>
<div class="viewcode-block" id="Filter"><a class="viewcode-back" href="../logging.html#logging.Filter">[文档]</a><span class="k">class</span> <span class="nc">Filter</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Filter instances are used to perform arbitrary filtering of LogRecords.</span>
<span class="sd"> Loggers and Handlers can optionally use Filter instances to filter</span>
<span class="sd"> records as desired. The base filter class only allows events which are</span>
<span class="sd"> below a certain point in the logger hierarchy. For example, a filter</span>
<span class="sd"> initialized with "A.B" will allow events logged by loggers "A.B",</span>
<span class="sd"> "A.B.C", "A.B.C.D", "A.B.D" etc. but not "A.BB", "B.A.B" etc. If</span>
<span class="sd"> initialized with the empty string, all events are passed.</span>
<span class="sd"> """</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">''</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Initialize a filter.</span>
<span class="sd"> Initialize with the name of the logger which, together with its</span>
<span class="sd"> children, will have its events allowed through the filter. If no</span>
<span class="sd"> name is specified, allow every event.</span>
<span class="sd"> """</span>
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
<span class="bp">self</span><span class="o">.</span><span class="n">nlen</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<div class="viewcode-block" id="Filter.filter"><a class="viewcode-back" href="../logging.html#logging.Filter.filter">[文档]</a> <span class="k">def</span> <span class="nf">filter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">record</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Determine if the specified record is to be logged.</span>
<span class="sd"> Is the specified record to be logged? Returns 0 for no, nonzero for</span>
<span class="sd"> yes. If deemed appropriate, the record may be modified in-place.</span>
<span class="sd"> """</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">nlen</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">record</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">elif</span> <span class="n">record</span><span class="o">.</span><span class="n">name</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">nlen</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">return</span> <span class="p">(</span><span class="n">record</span><span class="o">.</span><span class="n">name</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">nlen</span><span class="p">]</span> <span class="o">==</span> <span class="s2">"."</span><span class="p">)</span></div></div>
<span class="k">class</span> <span class="nc">Filterer</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> A base class for loggers and handlers which allows them to share</span>
<span class="sd"> common code.</span>
<span class="sd"> """</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Initialize the list of filters to be an empty list.</span>
<span class="sd"> """</span>
<span class="bp">self</span><span class="o">.</span><span class="n">filters</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">def</span> <span class="nf">addFilter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">filter</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Add the specified filter to this handler.</span>
<span class="sd"> """</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="nb">filter</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">filters</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">filters</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">filter</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">removeFilter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">filter</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Remove the specified filter from this handler.</span>
<span class="sd"> """</span>
<span class="k">if</span> <span class="nb">filter</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">filters</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">filters</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="nb">filter</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">filter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">record</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Determine if a record is loggable by consulting all the filters.</span>
<span class="sd"> The default is to allow the record to be logged; any filter can veto</span>
<span class="sd"> this and the record is then dropped. Returns a zero value if a record</span>
<span class="sd"> is to be dropped, else non-zero.</span>
<span class="sd"> .. versionchanged:: 3.2</span>
<span class="sd"> Allow filters to be just callables.</span>
<span class="sd"> """</span>
<span class="n">rv</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">filters</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="s1">'filter'</span><span class="p">):</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">record</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">f</span><span class="p">(</span><span class="n">record</span><span class="p">)</span> <span class="c1"># assume callable - will raise if not</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">result</span><span class="p">:</span>
<span class="n">rv</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">break</span>
<span class="k">return</span> <span class="n">rv</span>
<span class="c1">#---------------------------------------------------------------------------</span>
<span class="c1"># Handler classes and functions</span>
<span class="c1">#---------------------------------------------------------------------------</span>
<span class="n">_handlers</span> <span class="o">=</span> <span class="n">weakref</span><span class="o">.</span><span class="n">WeakValueDictionary</span><span class="p">()</span> <span class="c1">#map of handler names to handlers</span>
<span class="n">_handlerList</span> <span class="o">=</span> <span class="p">[]</span> <span class="c1"># added to allow handlers to be removed in reverse of order initialized</span>
<span class="k">def</span> <span class="nf">_removeHandlerRef</span><span class="p">(</span><span class="n">wr</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Remove a handler reference from the internal cleanup list.</span>
<span class="sd"> """</span>
<span class="c1"># This function can be called during module teardown, when globals are</span>
<span class="c1"># set to None. It can also be called from another thread. So we need to</span>
<span class="c1"># pre-emptively grab the necessary globals and check if they're None,</span>
<span class="c1"># to prevent race conditions and failures during interpreter shutdown.</span>
<span class="n">acquire</span><span class="p">,</span> <span class="n">release</span><span class="p">,</span> <span class="n">handlers</span> <span class="o">=</span> <span class="n">_acquireLock</span><span class="p">,</span> <span class="n">_releaseLock</span><span class="p">,</span> <span class="n">_handlerList</span>
<span class="k">if</span> <span class="n">acquire</span> <span class="ow">and</span> <span class="n">release</span> <span class="ow">and</span> <span class="n">handlers</span><span class="p">:</span>
<span class="n">acquire</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="n">wr</span> <span class="ow">in</span> <span class="n">handlers</span><span class="p">:</span>
<span class="n">handlers</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">wr</span><span class="p">)</span>
<span class="k">finally</span><span class="p">:</span>
<span class="n">release</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">_addHandlerRef</span><span class="p">(</span><span class="n">handler</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Add a handler to the internal cleanup list using a weak reference.</span>
<span class="sd"> """</span>
<span class="n">_acquireLock</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">_handlerList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">weakref</span><span class="o">.</span><span class="n">ref</span><span class="p">(</span><span class="n">handler</span><span class="p">,</span> <span class="n">_removeHandlerRef</span><span class="p">))</span>
<span class="k">finally</span><span class="p">:</span>
<span class="n">_releaseLock</span><span class="p">()</span>
<div class="viewcode-block" id="Handler"><a class="viewcode-back" href="../logging.html#logging.Handler">[文档]</a><span class="k">class</span> <span class="nc">Handler</span><span class="p">(</span><span class="n">Filterer</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Handler instances dispatch logging events to specific destinations.</span>
<span class="sd"> The base handler class. Acts as a placeholder which defines the Handler</span>
<span class="sd"> interface. Handlers can optionally use Formatter instances to format</span>
<span class="sd"> records as desired. By default, no formatter is specified; in this case,</span>
<span class="sd"> the 'raw' message as determined by record.message is logged.</span>
<span class="sd"> """</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="n">NOTSET</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Initializes the instance - basically setting the formatter to None</span>
<span class="sd"> and the filter list to empty.</span>
<span class="sd"> """</span>
<span class="n">Filterer</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_name</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">level</span> <span class="o">=</span> <span class="n">_checkLevel</span><span class="p">(</span><span class="n">level</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">formatter</span> <span class="o">=</span> <span class="kc">None</span>
<span class="c1"># Add the handler to the global _handlerList (for cleanup on shutdown)</span>
<span class="n">_addHandlerRef</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">createLock</span><span class="p">()</span>
<div class="viewcode-block" id="Handler.get_name"><a class="viewcode-back" href="../logging.html#logging.Handler.get_name">[文档]</a> <span class="k">def</span> <span class="nf">get_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_name</span></div>
<div class="viewcode-block" id="Handler.set_name"><a class="viewcode-back" href="../logging.html#logging.Handler.set_name">[文档]</a> <span class="k">def</span> <span class="nf">set_name</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="n">_acquireLock</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_name</span> <span class="ow">in</span> <span class="n">_handlers</span><span class="p">:</span>
<span class="k">del</span> <span class="n">_handlers</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_name</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_name</span> <span class="o">=</span> <span class="n">name</span>
<span class="k">if</span> <span class="n">name</span><span class="p">:</span>
<span class="n">_handlers</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span>
<span class="k">finally</span><span class="p">:</span>
<span class="n">_releaseLock</span><span class="p">()</span></div>
<span class="n">name</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">get_name</span><span class="p">,</span> <span class="n">set_name</span><span class="p">)</span>
<div class="viewcode-block" id="Handler.createLock"><a class="viewcode-back" href="../logging.html#logging.Handler.createLock">[文档]</a> <span class="k">def</span> <span class="nf">createLock</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Acquire a thread lock for serializing access to the underlying I/O.</span>
<span class="sd"> """</span>
<span class="k">if</span> <span class="n">threading</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">lock</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">RLock</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span> <span class="c1">#pragma: no cover</span>
<span class="bp">self</span><span class="o">.</span><span class="n">lock</span> <span class="o">=</span> <span class="kc">None</span></div>
<div class="viewcode-block" id="Handler.acquire"><a class="viewcode-back" href="../logging.html#logging.Handler.acquire">[文档]</a> <span class="k">def</span> <span class="nf">acquire</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Acquire the I/O thread lock.</span>
<span class="sd"> """</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">lock</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">lock</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span></div>
<div class="viewcode-block" id="Handler.release"><a class="viewcode-back" href="../logging.html#logging.Handler.release">[文档]</a> <span class="k">def</span> <span class="nf">release</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Release the I/O thread lock.</span>
<span class="sd"> """</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">lock</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">lock</span><span class="o">.</span><span class="n">release</span><span class="p">()</span></div>
<div class="viewcode-block" id="Handler.setLevel"><a class="viewcode-back" href="../logging.html#logging.Handler.setLevel">[文档]</a> <span class="k">def</span> <span class="nf">setLevel</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">level</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Set the logging level of this handler. level must be an int or a str.</span>
<span class="sd"> """</span>
<span class="bp">self</span><span class="o">.</span><span class="n">level</span> <span class="o">=</span> <span class="n">_checkLevel</span><span class="p">(</span><span class="n">level</span><span class="p">)</span></div>
<div class="viewcode-block" id="Handler.format"><a class="viewcode-back" href="../logging.html#logging.Handler.format">[文档]</a> <span class="k">def</span> <span class="nf">format</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">record</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Format the specified record.</span>
<span class="sd"> If a formatter is set, use it. Otherwise, use the default formatter</span>
<span class="sd"> for the module.</span>
<span class="sd"> """</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">formatter</span><span class="p">:</span>
<span class="n">fmt</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">formatter</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">fmt</span> <span class="o">=</span> <span class="n">_defaultFormatter</span>
<span class="k">return</span> <span class="n">fmt</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">record</span><span class="p">)</span></div>
<div class="viewcode-block" id="Handler.emit"><a class="viewcode-back" href="../logging.html#logging.Handler.emit">[文档]</a> <span class="k">def</span> <span class="nf">emit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">record</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Do whatever it takes to actually log the specified logging record.</span>
<span class="sd"> This version is intended to be implemented by subclasses and so</span>
<span class="sd"> raises a NotImplementedError.</span>
<span class="sd"> """</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s1">'emit must be implemented '</span>
<span class="s1">'by Handler subclasses'</span><span class="p">)</span></div>
<div class="viewcode-block" id="Handler.handle"><a class="viewcode-back" href="../logging.html#logging.Handler.handle">[文档]</a> <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">record</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Conditionally emit the specified logging record.</span>
<span class="sd"> Emission depends on filters which may have been added to the handler.</span>
<span class="sd"> Wrap the actual emission of the record with acquisition/release of</span>
<span class="sd"> the I/O thread lock. Returns whether the filter passed the record for</span>
<span class="sd"> emission.</span>
<span class="sd"> """</span>
<span class="n">rv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">record</span><span class="p">)</span>
<span class="k">if</span> <span class="n">rv</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">emit</span><span class="p">(</span><span class="n">record</span><span class="p">)</span>
<span class="k">finally</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">release</span><span class="p">()</span>
<span class="k">return</span> <span class="n">rv</span></div>
<div class="viewcode-block" id="Handler.setFormatter"><a class="viewcode-back" href="../logging.html#logging.Handler.setFormatter">[文档]</a> <span class="k">def</span> <span class="nf">setFormatter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fmt</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Set the formatter for this handler.</span>
<span class="sd"> """</span>
<span class="bp">self</span><span class="o">.</span><span class="n">formatter</span> <span class="o">=</span> <span class="n">fmt</span></div>
<div class="viewcode-block" id="Handler.flush"><a class="viewcode-back" href="../logging.html#logging.Handler.flush">[文档]</a> <span class="k">def</span> <span class="nf">flush</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Ensure all logging output has been flushed.</span>
<span class="sd"> This version does nothing and is intended to be implemented by</span>
<span class="sd"> subclasses.</span>
<span class="sd"> """</span>
<span class="k">pass</span></div>
<div class="viewcode-block" id="Handler.close"><a class="viewcode-back" href="../logging.html#logging.Handler.close">[文档]</a> <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Tidy up any resources used by the handler.</span>
<span class="sd"> This version removes the handler from an internal map of handlers,</span>
<span class="sd"> _handlers, which is used for handler lookup by name. Subclasses</span>
<span class="sd"> should ensure that this gets called from overridden close()</span>
<span class="sd"> methods.</span>
<span class="sd"> """</span>
<span class="c1">#get the module data lock, as we're updating a shared structure.</span>
<span class="n">_acquireLock</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span> <span class="c1">#unlikely to raise an exception, but you never know...</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_name</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_name</span> <span class="ow">in</span> <span class="n">_handlers</span><span class="p">:</span>
<span class="k">del</span> <span class="n">_handlers</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_name</span><span class="p">]</span>
<span class="k">finally</span><span class="p">:</span>
<span class="n">_releaseLock</span><span class="p">()</span></div>
<div class="viewcode-block" id="Handler.handleError"><a class="viewcode-back" href="../logging.html#logging.Handler.handleError">[文档]</a> <span class="k">def</span> <span class="nf">handleError</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">record</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Handle errors which occur during an emit() call.</span>
<span class="sd"> This method should be called from handlers when an exception is</span>
<span class="sd"> encountered during an emit() call. If raiseExceptions is false,</span>
<span class="sd"> exceptions get silently ignored. This is what is mostly wanted</span>
<span class="sd"> for a logging system - most users will not care about errors in</span>
<span class="sd"> the logging system, they are more interested in application errors.</span>
<span class="sd"> You could, however, replace this with a custom handler if you wish.</span>
<span class="sd"> The record which was being processed is passed in to this method.</span>
<span class="sd"> """</span>
<span class="k">if</span> <span class="n">raiseExceptions</span> <span class="ow">and</span> <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="p">:</span> <span class="c1"># see issue 13807</span>
<span class="n">t</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">tb</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'--- Logging error ---</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
<span class="n">traceback</span><span class="o">.</span><span class="n">print_exception</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">tb</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="p">)</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'Call stack:</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
<span class="c1"># Walk the stack frame up until we're out of logging,</span>
<span class="c1"># so as to print the calling context.</span>
<span class="n">frame</span> <span class="o">=</span> <span class="n">tb</span><span class="o">.</span><span class="n">tb_frame</span>
<span class="k">while</span> <span class="p">(</span><span class="n">frame</span> <span class="ow">and</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">frame</span><span class="o">.</span><span class="n">f_code</span><span class="o">.</span><span class="n">co_filename</span><span class="p">)</span> <span class="o">==</span>
<span class="n">__path__</span><span class="p">[</span><span class="mi">0</span><span class="p">]):</span>
<span class="n">frame</span> <span class="o">=</span> <span class="n">frame</span><span class="o">.</span><span class="n">f_back</span>
<span class="k">if</span> <span class="n">frame</span><span class="p">:</span>
<span class="n">traceback</span><span class="o">.</span><span class="n">print_stack</span><span class="p">(</span><span class="n">frame</span><span class="p">,</span> <span class="n">file</span><span class="o">=</span><span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># couldn't find the right stack frame, for some reason</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'Logged from file </span><span class="si">%s</span><span class="s1">, line </span><span class="si">%s</span><span class="se">\n</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span>
<span class="n">record</span><span class="o">.</span><span class="n">filename</span><span class="p">,</span> <span class="n">record</span><span class="o">.</span><span class="n">lineno</span><span class="p">))</span>
<span class="c1"># Issue 18671: output logging message and arguments</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'Message: </span><span class="si">%r</span><span class="se">\n</span><span class="s1">'</span>
<span class="s1">'Arguments: </span><span class="si">%s</span><span class="se">\n</span><span class="s1">'</span> <span class="o">%</span> <span class="p">(</span><span class="n">record</span><span class="o">.</span><span class="n">msg</span><span class="p">,</span>
<span class="n">record</span><span class="o">.</span><span class="n">args</span><span class="p">))</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">'Unable to print the message and arguments'</span>
<span class="s1">' - possible formatting error.</span><span class="se">\n</span><span class="s1">Use the'</span>
<span class="s1">' traceback above to help find the error.</span><span class="se">\n</span><span class="s1">'</span>
<span class="p">)</span>
<span class="k">except</span> <span class="ne">OSError</span><span class="p">:</span> <span class="c1">#pragma: no cover</span>
<span class="k">pass</span> <span class="c1"># see issue 5971</span>
<span class="k">finally</span><span class="p">:</span>
<span class="k">del</span> <span class="n">t</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">tb</span></div></div>
<div class="viewcode-block" id="StreamHandler"><a class="viewcode-back" href="../logging.html#logging.StreamHandler">[文档]</a><span class="k">class</span> <span class="nc">StreamHandler</span><span class="p">(</span><span class="n">Handler</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> A handler class which writes logging records, appropriately formatted,</span>
<span class="sd"> to a stream. Note that this class does not close the stream, as</span>
<span class="sd"> sys.stdout or sys.stderr may be used.</span>
<span class="sd"> """</span>
<span class="n">terminator</span> <span class="o">=</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stream</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Initialize the handler.</span>
<span class="sd"> If stream is not specified, sys.stderr is used.</span>
<span class="sd"> """</span>
<span class="n">Handler</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">if</span> <span class="n">stream</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">stream</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span>
<span class="bp">self</span><span class="o">.</span><span class="n">stream</span> <span class="o">=</span> <span class="n">stream</span>
<div class="viewcode-block" id="StreamHandler.flush"><a class="viewcode-back" href="../logging.html#logging.StreamHandler.flush">[文档]</a> <span class="k">def</span> <span class="nf">flush</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Flushes the stream.</span>
<span class="sd"> """</span>
<span class="bp">self</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">stream</span> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stream</span><span class="p">,</span> <span class="s2">"flush"</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">stream</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
<span class="k">finally</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">release</span><span class="p">()</span></div>
<div class="viewcode-block" id="StreamHandler.emit"><a class="viewcode-back" href="../logging.html#logging.StreamHandler.emit">[文档]</a> <span class="k">def</span> <span class="nf">emit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">record</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Emit a record.</span>
<span class="sd"> If a formatter is specified, it is used to format the record.</span>
<span class="sd"> The record is then written to the stream with a trailing newline. If</span>
<span class="sd"> exception information is present, it is formatted using</span>
<span class="sd"> traceback.print_exception and appended to the stream. If the stream</span>
<span class="sd"> has an 'encoding' attribute, it is used to determine how to do the</span>
<span class="sd"> output to the stream.</span>
<span class="sd"> """</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">record</span><span class="p">)</span>
<span class="n">stream</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">stream</span>
<span class="n">stream</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
<span class="n">stream</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">terminator</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">handleError</span><span class="p">(</span><span class="n">record</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="FileHandler"><a class="viewcode-back" href="../logging.html#logging.FileHandler">[文档]</a><span class="k">class</span> <span class="nc">FileHandler</span><span class="p">(</span><span class="n">StreamHandler</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> A handler class which writes formatted logging records to disk files.</span>
<span class="sd"> """</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="s1">'a'</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">delay</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Open the specified file and use it as the stream for logging.</span>
<span class="sd"> """</span>
<span class="c1">#keep the absolute path, otherwise derived classes which use this</span>
<span class="c1">#may come a cropper when the current directory changes</span>
<span class="bp">self</span><span class="o">.</span><span class="n">baseFilename</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">mode</span> <span class="o">=</span> <span class="n">mode</span>
<span class="bp">self</span><span class="o">.</span><span class="n">encoding</span> <span class="o">=</span> <span class="n">encoding</span>
<span class="bp">self</span><span class="o">.</span><span class="n">delay</span> <span class="o">=</span> <span class="n">delay</span>
<span class="k">if</span> <span class="n">delay</span><span class="p">:</span>
<span class="c1">#We don't open the stream, but we still need to call the</span>
<span class="c1">#Handler constructor to set level, formatter, lock etc.</span>
<span class="n">Handler</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">stream</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">StreamHandler</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_open</span><span class="p">())</span>
<div class="viewcode-block" id="FileHandler.close"><a class="viewcode-back" href="../logging.html#logging.FileHandler.close">[文档]</a> <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Closes the stream.</span>
<span class="sd"> """</span>
<span class="bp">self</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">stream</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
<span class="k">finally</span><span class="p">:</span>
<span class="n">stream</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">stream</span>
<span class="bp">self</span><span class="o">.</span><span class="n">stream</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">stream</span><span class="p">,</span> <span class="s2">"close"</span><span class="p">):</span>
<span class="n">stream</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">finally</span><span class="p">:</span>
<span class="c1"># Issue #19523: call unconditionally to</span>
<span class="c1"># prevent a handler leak when delay is set</span>
<span class="n">StreamHandler</span><span class="o">.</span><span class="n">close</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">finally</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">release</span><span class="p">()</span></div>
<span class="k">def</span> <span class="nf">_open</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Open the current base file with the (original) mode and encoding.</span>
<span class="sd"> Return the resulting stream.</span>
<span class="sd"> """</span>
<span class="k">return</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">baseFilename</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">mode</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">encoding</span><span class="p">)</span>
<div class="viewcode-block" id="FileHandler.emit"><a class="viewcode-back" href="../logging.html#logging.FileHandler.emit">[文档]</a> <span class="k">def</span> <span class="nf">emit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">record</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Emit a record.</span>
<span class="sd"> If the stream was not opened because 'delay' was specified in the</span>
<span class="sd"> constructor, open it before calling the superclass's emit.</span>
<span class="sd"> """</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">stream</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">stream</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_open</span><span class="p">()</span>
<span class="n">StreamHandler</span><span class="o">.</span><span class="n">emit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">record</span><span class="p">)</span></div></div>
<span class="k">class</span> <span class="nc">_StderrHandler</span><span class="p">(</span><span class="n">StreamHandler</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> This class is like a StreamHandler using sys.stderr, but always uses</span>
<span class="sd"> whatever sys.stderr is currently set to rather than the value of</span>
<span class="sd"> sys.stderr at handler construction time.</span>
<span class="sd"> """</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="n">NOTSET</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Initialize the handler.</span>
<span class="sd"> """</span>
<span class="n">Handler</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">level</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">stream</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span>
<span class="n">_defaultLastResort</span> <span class="o">=</span> <span class="n">_StderrHandler</span><span class="p">(</span><span class="n">WARNING</span><span class="p">)</span>
<span class="n">lastResort</span> <span class="o">=</span> <span class="n">_defaultLastResort</span>
<span class="c1">#---------------------------------------------------------------------------</span>
<span class="c1"># Manager classes and functions</span>
<span class="c1">#---------------------------------------------------------------------------</span>
<span class="k">class</span> <span class="nc">PlaceHolder</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> PlaceHolder instances are used in the Manager logger hierarchy to take</span>
<span class="sd"> the place of nodes for which no loggers have been defined. This class is</span>
<span class="sd"> intended for internal use only and not as part of the public API.</span>
<span class="sd"> """</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">alogger</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Initialize with the specified logger being a child of this placeholder.</span>
<span class="sd"> """</span>
<span class="bp">self</span><span class="o">.</span><span class="n">loggerMap</span> <span class="o">=</span> <span class="p">{</span> <span class="n">alogger</span> <span class="p">:</span> <span class="kc">None</span> <span class="p">}</span>
<span class="k">def</span> <span class="nf">append</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">alogger</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Add the specified logger as a child of this placeholder.</span>
<span class="sd"> """</span>
<span class="k">if</span> <span class="n">alogger</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">loggerMap</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">loggerMap</span><span class="p">[</span><span class="n">alogger</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
<span class="c1">#</span>
<span class="c1"># Determine which class to use when instantiating loggers.</span>
<span class="c1">#</span>
<div class="viewcode-block" id="setLoggerClass"><a class="viewcode-back" href="../logging.html#logging.setLoggerClass">[文档]</a><span class="k">def</span> <span class="nf">setLoggerClass</span><span class="p">(</span><span class="n">klass</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Set the class to be used when instantiating a logger. The class should</span>
<span class="sd"> define __init__() such that only a name argument is required, and the</span>
<span class="sd"> __init__() should call Logger.__init__()</span>
<span class="sd"> """</span>
<span class="k">if</span> <span class="n">klass</span> <span class="o">!=</span> <span class="n">Logger</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">klass</span><span class="p">,</span> <span class="n">Logger</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">"logger not derived from logging.Logger: "</span>
<span class="o">+</span> <span class="n">klass</span><span class="o">.</span><span class="vm">__name__</span><span class="p">)</span>
<span class="k">global</span> <span class="n">_loggerClass</span>
<span class="n">_loggerClass</span> <span class="o">=</span> <span class="n">klass</span></div>
<div class="viewcode-block" id="getLoggerClass"><a class="viewcode-back" href="../logging.html#logging.getLoggerClass">[文档]</a><span class="k">def</span> <span class="nf">getLoggerClass</span><span class="p">():</span>
<span class="sd">"""</span>
<span class="sd"> Return the class to be used when instantiating a logger.</span>
<span class="sd"> """</span>
<span class="k">return</span> <span class="n">_loggerClass</span></div>
<span class="k">class</span> <span class="nc">Manager</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> There is [under normal circumstances] just one Manager instance, which</span>
<span class="sd"> holds the hierarchy of loggers.</span>
<span class="sd"> """</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">rootnode</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Initialize the manager with the root node of the logger hierarchy.</span>
<span class="sd"> """</span>
<span class="bp">self</span><span class="o">.</span><span class="n">root</span> <span class="o">=</span> <span class="n">rootnode</span>
<span class="bp">self</span><span class="o">.</span><span class="n">disable</span> <span class="o">=</span> <span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">emittedNoHandlerWarning</span> <span class="o">=</span> <span class="kc">False</span>
<span class="bp">self</span><span class="o">.</span><span class="n">loggerDict</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">loggerClass</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logRecordFactory</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">def</span> <span class="nf">getLogger</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Get a logger with the specified name (channel name), creating it</span>
<span class="sd"> if it doesn't yet exist. This name is a dot-separated hierarchical</span>
<span class="sd"> name, such as "a", "a.b", "a.b.c" or similar.</span>
<span class="sd"> If a PlaceHolder existed for the specified name [i.e. the logger</span>
<span class="sd"> didn't exist but a child of it did], replace it with the created</span>
<span class="sd"> logger and fix up the parent/child references which pointed to the</span>
<span class="sd"> placeholder to now point to the logger.</span>
<span class="sd"> """</span>
<span class="n">rv</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">'A logger name must be a string'</span><span class="p">)</span>
<span class="n">_acquireLock</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">loggerDict</span><span class="p">:</span>
<span class="n">rv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">loggerDict</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">rv</span><span class="p">,</span> <span class="n">PlaceHolder</span><span class="p">):</span>
<span class="n">ph</span> <span class="o">=</span> <span class="n">rv</span>
<span class="n">rv</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">loggerClass</span> <span class="ow">or</span> <span class="n">_loggerClass</span><span class="p">)(</span><span class="n">name</span><span class="p">)</span>
<span class="n">rv</span><span class="o">.</span><span class="n">manager</span> <span class="o">=</span> <span class="bp">self</span>
<span class="bp">self</span><span class="o">.</span><span class="n">loggerDict</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">rv</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_fixupChildren</span><span class="p">(</span><span class="n">ph</span><span class="p">,</span> <span class="n">rv</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_fixupParents</span><span class="p">(</span><span class="n">rv</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">rv</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">loggerClass</span> <span class="ow">or</span> <span class="n">_loggerClass</span><span class="p">)(</span><span class="n">name</span><span class="p">)</span>
<span class="n">rv</span><span class="o">.</span><span class="n">manager</span> <span class="o">=</span> <span class="bp">self</span>
<span class="bp">self</span><span class="o">.</span><span class="n">loggerDict</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">rv</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_fixupParents</span><span class="p">(</span><span class="n">rv</span><span class="p">)</span>
<span class="k">finally</span><span class="p">:</span>
<span class="n">_releaseLock</span><span class="p">()</span>
<span class="k">return</span> <span class="n">rv</span>
<span class="k">def</span> <span class="nf">setLoggerClass</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">klass</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Set the class to be used when instantiating a logger with this Manager.</span>
<span class="sd"> """</span>
<span class="k">if</span> <span class="n">klass</span> <span class="o">!=</span> <span class="n">Logger</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">klass</span><span class="p">,</span> <span class="n">Logger</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">"logger not derived from logging.Logger: "</span>
<span class="o">+</span> <span class="n">klass</span><span class="o">.</span><span class="vm">__name__</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">loggerClass</span> <span class="o">=</span> <span class="n">klass</span>
<span class="k">def</span> <span class="nf">setLogRecordFactory</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">factory</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Set the factory to be used when instantiating a log record with this</span>
<span class="sd"> Manager.</span>
<span class="sd"> """</span>
<span class="bp">self</span><span class="o">.</span><span class="n">logRecordFactory</span> <span class="o">=</span> <span class="n">factory</span>
<span class="k">def</span> <span class="nf">_fixupParents</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">alogger</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> Ensure that there are either loggers or placeholders all the way</span>
<span class="sd"> from the specified logger to the root of the logger hierarchy.</span>
<span class="sd"> """</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">alogger</span><span class="o">.</span><span class="n">name</span>
<span class="n">i</span> <span class="o">=</span> <span class="n">name</span><span class="o">.</span><span class="n">rfind</span><span class="p">(</span><span class="s2">"."</span><span class="p">)</span>
<span class="n">rv</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">while</span> <span class="p">(</span><span class="n">i</span> <span class="o">></span> <span class="mi">0</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">rv</span><span class="p">:</span>
<span class="n">substr</span> <span class="o">=</span> <span class="n">name</span><span class="p">[:</span><span class="n">i</span><span class="p">]</span>
<span class="k">if</span> <span class="n">substr</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">loggerDict</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">loggerDict</span><span class="p">[</span><span class="n">substr</span><span class="p">]</span> <span class="o">=</span> <span class="n">PlaceHolder</span><span class="p">(</span><span class="n">alogger</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">obj</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">loggerDict</span><span class="p">[</span><span class="n">substr</span><span class="p">]</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">Logger</span><span class="p">):</span>
<span class="n">rv</span> <span class="o">=</span> <span class="n">obj</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">PlaceHolder</span><span class="p">)</span>
<span class="n">obj</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">alogger</span><span cla
gitextract__p4m59za/ ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── ----.md │ │ └── bug---.md │ ├── stale.yml │ └── workflows/ │ └── dockerimage.yml ├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── VERSION ├── docker/ │ ├── Dockerfile │ └── DockerfileArm ├── docs/ │ ├── .buildinfo │ ├── .nojekyll │ ├── AI.html │ ├── ASR.html │ ├── Brain.html │ ├── ConfigMonitor.html │ ├── Conversation.html │ ├── Player.html │ ├── TTS.html │ ├── Updater.html │ ├── _modules/ │ │ ├── index.html │ │ ├── logging.html │ │ ├── plugins/ │ │ │ ├── Camera.html │ │ │ ├── CleanCache.html │ │ │ ├── Echo.html │ │ │ ├── Email.html │ │ │ ├── Geek.html │ │ │ ├── LocalPlayer.html │ │ │ └── Poem.html │ │ ├── robot/ │ │ │ ├── AI.html │ │ │ ├── ASR.html │ │ │ ├── Brain.html │ │ │ ├── ConfigMonitor.html │ │ │ ├── Conversation.html │ │ │ ├── NLU.html │ │ │ ├── Player.html │ │ │ ├── TTS.html │ │ │ ├── Updater.html │ │ │ ├── config.html │ │ │ ├── constants.html │ │ │ ├── drivers/ │ │ │ │ ├── apa102.html │ │ │ │ └── pixels.html │ │ │ ├── logging.html │ │ │ ├── plugin_loader.html │ │ │ ├── sdk/ │ │ │ │ ├── AbstractPlugin.html │ │ │ │ ├── AliSpeech.html │ │ │ │ ├── RASRsdk.html │ │ │ │ ├── TencentSpeech.html │ │ │ │ ├── XunfeiSpeech.html │ │ │ │ └── unit.html │ │ │ ├── statistic.html │ │ │ └── utils.html │ │ ├── snowboy/ │ │ │ ├── snowboydecoder.html │ │ │ └── snowboydetect.html │ │ └── wukong.html │ ├── _sources/ │ │ ├── AI.rst.txt │ │ ├── ASR.rst.txt │ │ ├── Brain.rst.txt │ │ ├── ConfigMonitor.rst.txt │ │ ├── Conversation.rst.txt │ │ ├── Player.rst.txt │ │ ├── TTS.rst.txt │ │ ├── Updater.rst.txt │ │ ├── config.rst.txt │ │ ├── constants.rst.txt │ │ ├── drivers.rst.txt │ │ ├── index.rst.txt │ │ ├── logging.rst.txt │ │ ├── modules.rst.txt │ │ ├── plugin_loader.rst.txt │ │ ├── plugins.rst.txt │ │ ├── robot.drivers.rst.txt │ │ ├── robot.rst.txt │ │ ├── robot.sdk.rst.txt │ │ ├── snowboy.rst.txt │ │ ├── statistic.rst.txt │ │ ├── utils.rst.txt │ │ └── wukong.rst.txt │ ├── _static/ │ │ ├── alabaster.css │ │ ├── basic.css │ │ ├── css/ │ │ │ ├── badge_only.css │ │ │ └── theme.css │ │ ├── custom.css │ │ ├── doctools.js │ │ ├── documentation_options.js │ │ ├── jquery-3.2.1.js │ │ ├── jquery.js │ │ ├── js/ │ │ │ └── theme.js │ │ ├── language_data.js │ │ ├── pygments.css │ │ ├── searchtools.js │ │ ├── translations.js │ │ ├── underscore-1.3.1.js │ │ ├── underscore.js │ │ └── websupport.js │ ├── config.html │ ├── constants.html │ ├── drivers.html │ ├── genindex.html │ ├── index.html │ ├── logging.html │ ├── modules.html │ ├── objects.inv │ ├── plugin_loader.html │ ├── plugins.html │ ├── py-modindex.html │ ├── robot.drivers.html │ ├── robot.html │ ├── robot.sdk.html │ ├── search.html │ ├── searchindex.js │ ├── snowboy.html │ ├── statistic.html │ ├── utils.html │ └── wukong.html ├── plugins/ │ ├── Camera.py │ ├── CleanCache.py │ ├── Echo.py │ ├── Email.py │ ├── Geek.py │ ├── Gossip.py │ ├── LocalPlayer.py │ ├── Poem.py │ ├── Reminder.py │ ├── Volume.py │ └── __init__.py ├── requirements.txt ├── robot/ │ ├── AI.py │ ├── ASR.py │ ├── BCI.py │ ├── Brain.py │ ├── ConfigMonitor.py │ ├── Conversation.py │ ├── LifeCycleHandler.py │ ├── NLU.py │ ├── Player.py │ ├── Scheduler.py │ ├── TTS.py │ ├── Updater.py │ ├── __init__.py │ ├── config.py │ ├── constants.py │ ├── detector.py │ ├── drivers/ │ │ ├── AIY.py │ │ ├── __init__.py │ │ ├── apa102.py │ │ └── pixels.py │ ├── logging.py │ ├── plugin_loader.py │ ├── sdk/ │ │ ├── AbstractPlugin.py │ │ ├── AliSpeech.py │ │ ├── BaiduSpeech.py │ │ ├── FunASREngine.py │ │ ├── History.py │ │ ├── LED.py │ │ ├── RASRsdk.py │ │ ├── TencentSpeech.py │ │ ├── Unihiker.py │ │ ├── VITSClient.py │ │ ├── VolcengineSpeech.py │ │ ├── XunfeiSpeech.py │ │ ├── __init__.py │ │ ├── atc.py │ │ └── unit.py │ ├── statistic.py │ └── utils.py ├── server/ │ ├── server.py │ ├── static/ │ │ ├── api.css │ │ ├── bootbox.js │ │ ├── bubble.css │ │ ├── config.js │ │ ├── index.js │ │ ├── jquery.fancybox.css │ │ ├── jquery.fancybox.js │ │ ├── log.js │ │ ├── main.js │ │ ├── modernizr.touch.js │ │ ├── monokai-sublime.css │ │ ├── qa.js │ │ ├── signin.css │ │ ├── spin.css │ │ ├── starter-template.css │ │ └── static.js │ └── templates/ │ ├── api.html │ ├── api.md │ ├── config.html │ ├── donate.html │ ├── index.html │ ├── layout.html │ ├── log.html │ ├── login.html │ └── qa.html ├── snowboy/ │ ├── __init__.py │ ├── resources/ │ │ └── common.res │ ├── snowboydecoder.py │ └── snowboydetect.py ├── static/ │ ├── default.yml │ ├── qa.csv │ ├── snowboy.umdl │ ├── wukong.pmdl │ ├── wukong_pi.pmdl │ └── zhimakaimen.pmdl ├── tools/ │ ├── changelog.sh │ ├── make_json.py │ ├── solr_api.py │ └── solr_tools.py └── wukong.py
SYMBOL INDEX (873 symbols across 69 files)
FILE: docs/_static/doctools.js
function highlight (line 69) | function highlight(node, addItems) {
FILE: docs/_static/jquery-3.2.1.js
function DOMEval (line 76) | function DOMEval( code, doc ) {
function isArrayLike (line 522) | function isArrayLike( obj ) {
function Sizzle (line 754) | function Sizzle( selector, context, results, seed ) {
function createCache (line 893) | function createCache() {
function markFunction (line 911) | function markFunction( fn ) {
function assert (line 920) | function assert( fn ) {
function addHandle (line 942) | function addHandle( attrs, handler ) {
function siblingCheck (line 957) | function siblingCheck( a, b ) {
function createInputPseudo (line 983) | function createInputPseudo( type ) {
function createButtonPseudo (line 994) | function createButtonPseudo( type ) {
function createDisabledPseudo (line 1005) | function createDisabledPseudo( disabled ) {
function createPositionalPseudo (line 1061) | function createPositionalPseudo( fn ) {
function testContext (line 1084) | function testContext( context ) {
function setFilters (line 2166) | function setFilters() {}
function toSelector (line 2237) | function toSelector( tokens ) {
function addCombinator (line 2247) | function addCombinator( matcher, combinator, base ) {
function elementMatcher (line 2311) | function elementMatcher( matchers ) {
function multipleContexts (line 2325) | function multipleContexts( selector, contexts, results ) {
function condense (line 2334) | function condense( unmatched, map, filter, context, xml ) {
function setMatcher (line 2355) | function setMatcher( preFilter, selector, matcher, postFilter, postFinde...
function matcherFromTokens (line 2448) | function matcherFromTokens( tokens ) {
function matcherFromGroupMatchers (line 2506) | function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
function nodeName (line 2842) | function nodeName( elem, name ) {
function winnow (line 2854) | function winnow( elements, qualifier, not ) {
function sibling (line 3157) | function sibling( cur, dir ) {
function createOptions (line 3244) | function createOptions( options ) {
function Identity (line 3469) | function Identity( v ) {
function Thrower (line 3472) | function Thrower( ex ) {
function adoptValue (line 3476) | function adoptValue( value, resolve, reject, noValue ) {
function resolve (line 3569) | function resolve( depth, deferred, handler, special ) {
function completed (line 3927) | function completed() {
function Data (line 4029) | function Data() {
function getData (line 4198) | function getData( data ) {
function dataAttr (line 4223) | function dataAttr( elem, key, data ) {
function adjustCSS (line 4536) | function adjustCSS( elem, prop, valueParts, tween ) {
function getDefaultDisplay (line 4601) | function getDefaultDisplay( elem ) {
function showHide (line 4624) | function showHide( elements, show ) {
function getAll (line 4725) | function getAll( context, tag ) {
function setGlobalEval (line 4750) | function setGlobalEval( elems, refElements ) {
function buildFragment (line 4766) | function buildFragment( elems, context, scripts, selection, ignored ) {
function returnTrue (line 4889) | function returnTrue() {
function returnFalse (line 4893) | function returnFalse() {
function safeActiveElement (line 4899) | function safeActiveElement() {
function on (line 4905) | function on( elem, types, selector, data, fn, one ) {
function manipulationTarget (line 5634) | function manipulationTarget( elem, content ) {
function disableScript (line 5645) | function disableScript( elem ) {
function restoreScript (line 5649) | function restoreScript( elem ) {
function cloneCopyEvent (line 5661) | function cloneCopyEvent( src, dest ) {
function fixInput (line 5696) | function fixInput( src, dest ) {
function domManip (line 5709) | function domManip( collection, args, callback, ignored ) {
function remove (line 5799) | function remove( elem, selector, keepData ) {
function computeStyleTests (line 6092) | function computeStyleTests() {
function curCSS (line 6166) | function curCSS( elem, name, computed ) {
function addGetHookIf (line 6219) | function addGetHookIf( conditionFn, hookFn ) {
function vendorPropName (line 6256) | function vendorPropName( name ) {
function finalPropName (line 6277) | function finalPropName( name ) {
function setPositiveNumber (line 6285) | function setPositiveNumber( elem, value, subtract ) {
function augmentWidthOrHeight (line 6297) | function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
function getWidthOrHeight (line 6343) | function getWidthOrHeight( elem, name, extra ) {
function Tween (line 6652) | function Tween( elem, options, prop, end, easing ) {
function schedule (line 6775) | function schedule() {
function createFxNow (line 6788) | function createFxNow() {
function genFx (line 6796) | function genFx( type, includeWidth ) {
function createTween (line 6816) | function createTween( value, prop, animation ) {
function defaultPrefilter (line 6830) | function defaultPrefilter( elem, props, opts ) {
function propFilter (line 7001) | function propFilter( props, specialEasing ) {
function Animation (line 7038) | function Animation( elem, properties, options ) {
function stripAndCollapse (line 7753) | function stripAndCollapse( value ) {
function getClass (line 7759) | function getClass( elem ) {
function buildParams (line 8383) | function buildParams( prefix, obj, traditional, add ) {
function addToPrefiltersOrTransports (line 8533) | function addToPrefiltersOrTransports( structure ) {
function inspectPrefiltersOrTransports (line 8567) | function inspectPrefiltersOrTransports( structure, options, originalOpti...
function ajaxExtend (line 8596) | function ajaxExtend( target, src ) {
function ajaxHandleResponses (line 8616) | function ajaxHandleResponses( s, jqXHR, responses ) {
function ajaxConvert (line 8674) | function ajaxConvert( s, response, jqXHR, isSuccess ) {
function done (line 9187) | function done( status, nativeStatusText, responses, headers ) {
FILE: docs/_static/jquery.js
function p (line 2) | function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.a...
function w (line 2) | function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"funct...
function ga (line 2) | function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeTy...
function ha (line 2) | function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLengt...
function ia (line 2) | function ia(a){return a[u]=!0,a}
function ja (line 2) | function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(...
function ka (line 2) | function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[...
function la (line 2) | function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourc...
function ma (line 2) | function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"...
function na (line 2) | function na(a){return function(b){var c=b.nodeName.toLowerCase();return(...
function oa (line 2) | function oa(a){return function(b){return"form"in b?b.parentNode&&b.disab...
function pa (line 2) | function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,...
function qa (line 2) | function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}
function ra (line 2) | function ra(){}
function sa (line 2) | function sa(a){for(var b=0,c=a.length,d="";b<c;b++)d+=a[b].value;return d}
function ta (line 2) | function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x...
function ua (line 2) | function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e-...
function va (line 2) | function va(a,b,c){for(var d=0,e=b.length;d<e;d++)ga(a,b[d],c);return c}
function wa (line 2) | function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;h<i;h++)(...
function xa (line 2) | function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)...
function ya (line 2) | function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.r...
function za (line 2) | function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var...
function B (line 2) | function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerC...
function E (line 2) | function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!...
function K (line 2) | function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}
function M (line 2) | function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!...
function N (line 2) | function N(a){return a}
function O (line 2) | function O(a){throw a}
function P (line 2) | function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).don...
function g (line 2) | function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(...
function S (line 2) | function S(){d.removeEventListener("DOMContentLoaded",S),
function V (line 3) | function V(){this.expando=r.expando+V.uid++}
function $ (line 3) | function $(a){return"true"===a||"false"!==a&&("null"===a?null:a===+a+""?...
function _ (line 3) | function _(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.rep...
function fa (line 3) | function fa(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:funct...
function ha (line 3) | function ha(a){var b,c=a.ownerDocument,d=a.nodeName,e=ga[d];return e?e:(...
function ia (line 3) | function ia(a,b){for(var c,d,e=[],f=0,g=a.length;f<g;f++)d=a[f],d.style&...
function na (line 3) | function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagNa...
function oa (line 3) | function oa(a,b){for(var c=0,d=a.length;c<d;c++)W.set(a[c],"globalEval",...
function qa (line 3) | function qa(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),...
function va (line 3) | function va(){return!0}
function wa (line 3) | function wa(){return!1}
function xa (line 3) | function xa(){try{return d.activeElement}catch(a){}}
function ya (line 3) | function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof...
function Ea (line 3) | function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"...
function Fa (line 3) | function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}
function Ga (line 3) | function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttrib...
function Ha (line 3) | function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&...
function Ia (line 3) | function Ia(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ja.test(a.t...
function Ja (line 3) | function Ja(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-...
function Ka (line 3) | function Ka(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e[f]);f++)...
function b (line 3) | function b(){if(i){i.style.cssText="box-sizing:border-box;position:relat...
function Oa (line 3) | function Oa(a,b,c){var d,e,f,g,h=a.style;return c=c||Na(a),c&&(g=c.getPr...
function Pa (line 3) | function Pa(a,b){return{get:function(){return a()?void delete this.get:(...
function Wa (line 3) | function Wa(a){if(a in Va)return a;var b=a[0].toUpperCase()+a.slice(1),c...
function Xa (line 3) | function Xa(a){var b=r.cssProps[a];return b||(b=r.cssProps[a]=Wa(a)||a),b}
function Ya (line 3) | function Ya(a,b,c){var d=ba.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[...
function Za (line 3) | function Za(a,b,c,d,e){var f,g=0;for(f=c===(d?"border":"content")?4:"wid...
function $a (line 3) | function $a(a,b,c){var d,e=Na(a),f=Oa(a,b,e),g="border-box"===r.css(a,"b...
function _a (line 3) | function _a(a,b,c,d,e){return new _a.prototype.init(a,b,c,d,e)}
function eb (line 3) | function eb(){bb&&(d.hidden===!1&&a.requestAnimationFrame?a.requestAnima...
function fb (line 3) | function fb(){return a.setTimeout(function(){ab=void 0}),ab=r.now()}
function gb (line 3) | function gb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ca[d],e...
function hb (line 3) | function hb(a,b,c){for(var d,e=(kb.tweeners[b]||[]).concat(kb.tweeners["...
function ib (line 3) | function ib(a,b,c){var d,e,f,g,h,i,j,k,l="width"in b||"height"in b,m=thi...
function jb (line 3) | function jb(a,b){var c,d,e,f,g;for(c in a)if(d=r.camelCase(c),e=b[d],f=a...
function kb (line 3) | function kb(a,b,c){var d,e,f=0,g=kb.prefilters.length,h=r.Deferred().alw...
function pb (line 4) | function pb(a){var b=a.match(L)||[];return b.join(" ")}
function qb (line 4) | function qb(a){return a.getAttribute&&a.getAttribute("class")||""}
function Ab (line 4) | function Ab(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c|...
function Mb (line 4) | function Mb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var ...
function Nb (line 4) | function Nb(a,b,c,d){var e={},f=a===Jb;function g(h){var i;return e[h]=!...
function Ob (line 4) | function Ob(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)voi...
function Pb (line 4) | function Pb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[...
function Qb (line 4) | function Qb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])fo...
function A (line 4) | function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=vo...
FILE: docs/_static/js/theme.js
function c (line 3) | function c(e,n){if(!a[e]){if(!s[e]){var i="function"==typeof require&&re...
FILE: docs/_static/language_data.js
function splitQuery (line 278) | function splitQuery(query) {
FILE: docs/_static/searchtools.js
function splitQuery (line 45) | function splitQuery(query) {
function pulse (line 102) | function pulse() {
function displayNextItem (line 233) | function displayNextItem() {
FILE: docs/_static/underscore-1.3.1.js
function eq (line 669) | function eq(a, b, stack) {
FILE: docs/_static/underscore.js
function q (line 8) | function q(a,c,d){if(a===c)return a!==0||1/a==1/c;if(a==null||c==null)re...
FILE: docs/_static/websupport.js
function init (line 47) | function init() {
function initEvents (line 52) | function initEvents() {
function setComparator (line 107) | function setComparator() {
function initComparator (line 127) | function initComparator() {
function show (line 147) | function show(id) {
function hide (line 168) | function hide(id) {
function getComments (line 181) | function getComments(id) {
function addComment (line 216) | function addComment(form) {
function appendComments (line 275) | function appendComments(comments, ul) {
function insertComment (line 290) | function insertComment(comment) {
function acceptComment (line 320) | function acceptComment(id) {
function deleteComment (line 335) | function deleteComment(id) {
function showProposal (line 369) | function showProposal(id) {
function hideProposal (line 375) | function hideProposal(id) {
function showProposeChange (line 381) | function showProposeChange(id) {
function hideProposeChange (line 390) | function hideProposeChange(id) {
function toggleCommentMarkupBox (line 398) | function toggleCommentMarkupBox(id) {
function handleReSort (line 403) | function handleReSort(link) {
function handleVote (line 426) | function handleVote(link) {
function openReply (line 488) | function openReply(id) {
function closeReply (line 516) | function closeReply(id) {
function sortComments (line 530) | function sortComments(comments) {
function getChildren (line 542) | function getChildren(ul, recursive) {
function createCommentDiv (line 555) | function createCommentDiv(comment) {
function renderTemplate (line 593) | function renderTemplate(template, context) {
function showError (line 610) | function showError(message) {
FILE: plugins/Camera.py
class Plugin (line 12) | class Plugin(AbstractPlugin):
method handle (line 16) | def handle(self, text, parsed):
method isValid (line 82) | def isValid(self, text, parsed):
FILE: plugins/CleanCache.py
class Plugin (line 8) | class Plugin(AbstractPlugin):
method handle (line 12) | def handle(self, text, parsed):
method isValid (line 19) | def isValid(self, text, parsed):
FILE: plugins/Echo.py
class Plugin (line 11) | class Plugin(AbstractPlugin):
method handle (line 12) | def handle(self, text, parsed):
method isValid (line 16) | def isValid(self, text, parsed):
FILE: plugins/Email.py
class Plugin (line 12) | class Plugin(AbstractPlugin):
method getSender (line 16) | def getSender(self, msg):
method isSelfEmail (line 46) | def isSelfEmail(self, msg):
method getSubject (line 53) | def getSubject(self, msg):
method isNewEmail (line 79) | def isNewEmail(msg):
method getDate (line 89) | def getDate(self, email):
method getMostRecentDate (line 92) | def getMostRecentDate(self, emails):
method fetchUnreadEmails (line 108) | def fetchUnreadEmails(self, since=None, markRead=False, limit=None):
method handle (line 155) | def handle(self, text, parsed):
method isValid (line 184) | def isValid(self, text, parsed):
FILE: plugins/Geek.py
class Plugin (line 8) | class Plugin(AbstractPlugin):
method __init__ (line 13) | def __init__(self, con):
method handle (line 17) | def handle(self, text, parsed):
method onAsk (line 29) | def onAsk(self, input):
method restore (line 42) | def restore(self):
method isValidImmersive (line 45) | def isValidImmersive(self, text, parsed):
method isValid (line 52) | def isValid(self, text, parsed):
FILE: plugins/Gossip.py
class Plugin (line 14) | class Plugin(AbstractPlugin):
method handle (line 18) | def handle(self, text, parsed):
method isValidImmersive (line 27) | def isValidImmersive(self, text, parsed):
method isValid (line 30) | def isValid(self, text, parsed):
FILE: plugins/LocalPlayer.py
class Plugin (line 12) | class Plugin(AbstractPlugin):
method __init__ (line 16) | def __init__(self, con):
method get_song_list (line 21) | def get_song_list(self, path):
method init_music_player (line 29) | def init_music_player(self):
method handle (line 36) | def handle(self, text, parsed):
method pause (line 79) | def pause(self):
method restore (line 90) | def restore(self):
method isValidImmersive (line 94) | def isValidImmersive(self, text, parsed):
method isValid (line 107) | def isValid(self, text, parsed):
FILE: plugins/Poem.py
class Plugin (line 13) | class Plugin(AbstractPlugin):
method handle (line 17) | def handle(self, text, parsed):
method isValid (line 25) | def isValid(self, text, parsed):
FILE: plugins/Reminder.py
class Plugin (line 18) | class Plugin(AbstractPlugin):
method __init__ (line 19) | def __init__(self, con):
method _dump_reminders (line 22) | def _dump_reminders(self):
method alarm (line 27) | def alarm(self, remind_time, content, job_id):
method list_reminder (line 39) | def list_reminder(self, parsed):
method add_reminder (line 58) | def add_reminder(self, parsed):
method _assure (line 91) | def _assure(self):
method _ask_which (line 102) | def _ask_which(self):
method del_reminder (line 125) | def del_reminder(self, parsed):
method handle (line 150) | def handle(self, text, parsed):
method isValid (line 162) | def isValid(self, text, parsed):
FILE: plugins/Volume.py
class Plugin (line 9) | class Plugin(AbstractPlugin):
method __init__ (line 10) | def __init__(self, con):
method handle (line 14) | def handle(self, text, parsed):
method isValid (line 38) | def isValid(self, text, parsed):
FILE: robot/AI.py
class AbstractRobot (line 15) | class AbstractRobot(object):
method get_instance (line 20) | def get_instance(cls):
method __init__ (line 25) | def __init__(self, **kwargs):
method chat (line 29) | def chat(self, texts, parsed):
method stream_chat (line 33) | def stream_chat(self, texts):
class TulingRobot (line 37) | class TulingRobot(AbstractRobot):
method __init__ (line 41) | def __init__(self, tuling_key):
method get_config (line 49) | def get_config(cls):
method chat (line 52) | def chat(self, texts, parsed=None):
class UnitRobot (line 85) | class UnitRobot(AbstractRobot):
method __init__ (line 89) | def __init__(self):
method get_config (line 96) | def get_config(cls):
method chat (line 99) | def chat(self, texts, parsed):
class BingRobot (line 117) | class BingRobot(AbstractRobot):
method __init__ (line 121) | def __init__(self, prefix, proxy, mode):
method get_config (line 131) | def get_config(cls):
method chat (line 134) | def chat(self, texts, parsed):
class AnyQRobot (line 170) | class AnyQRobot(AbstractRobot):
method __init__ (line 174) | def __init__(self, host, port, solr_port, threshold, secondary):
method get_config (line 185) | def get_config(cls):
method chat (line 189) | def chat(self, texts, parsed):
class OPENAIRobot (line 229) | class OPENAIRobot(AbstractRobot):
method __init__ (line 233) | def __init__(
method get_config (line 283) | def get_config(cls):
method stream_chat (line 287) | def stream_chat(self, texts):
method chat (line 368) | def chat(self, texts, parsed):
class WenxinRobot (line 419) | class WenxinRobot(AbstractRobot):
method __init__ (line 423) | def __init__(self, api_key, secret_key):
method get_config (line 432) | def get_config(cls):
method chat (line 435) | def chat(self, texts, _):
class TongyiRobot (line 467) | class TongyiRobot(AbstractRobot):
method __init__ (line 475) | def __init__(self, api_key):
method get_config (line 483) | def get_config(cls):
method chat (line 486) | def chat(self, texts, _):
class CozeRobot (line 509) | class CozeRobot(AbstractRobot):
method __init__ (line 512) | def __init__(self, botid, token, **kwargs):
method get_config (line 519) | def get_config(cls):
method chat (line 522) | def chat(self, texts, parsed=None):
function get_unknown_response (line 568) | def get_unknown_response():
function get_robot_by_slug (line 578) | def get_robot_by_slug(slug):
function get_robots (line 604) | def get_robots():
FILE: robot/ASR.py
class AbstractASR (line 13) | class AbstractASR(object):
method get_config (line 21) | def get_config(cls):
method get_instance (line 25) | def get_instance(cls):
method transcribe (line 31) | def transcribe(self, fp):
class AzureASR (line 35) | class AzureASR(AbstractASR):
method __init__ (line 42) | def __init__(self, secret_key, region, lang="zh-CN", **args):
method get_config (line 58) | def get_config(cls):
method transcribe (line 62) | def transcribe(self, fp):
class BaiduASR (line 81) | class BaiduASR(AbstractASR):
method __init__ (line 104) | def __init__(self, appid, api_key, secret_key, dev_pid=1936, **args):
method get_config (line 113) | def get_config(cls):
method transcribe (line 117) | def transcribe(self, fp):
class TencentASR (line 131) | class TencentASR(AbstractASR):
method __init__ (line 138) | def __init__(self, appid, secretid, secret_key, region="ap-guangzhou",...
method get_config (line 144) | def get_config(cls):
method transcribe (line 148) | def transcribe(self, fp):
class XunfeiASR (line 161) | class XunfeiASR(AbstractASR):
method __init__ (line 169) | def __init__(self, appid, api_key, api_secret, **args):
method get_config (line 176) | def get_config(cls):
method transcribe (line 180) | def transcribe(self, fp):
class AliASR (line 184) | class AliASR(AbstractASR):
method __init__ (line 191) | def __init__(self, appKey, token, **args):
method get_config (line 196) | def get_config(cls):
method transcribe (line 200) | def transcribe(self, fp):
class WhisperASR (line 210) | class WhisperASR(AbstractASR):
method __init__ (line 217) | def __init__(self, openai_api_key, **args):
method get_config (line 229) | def get_config(cls):
method transcribe (line 232) | def transcribe(self, fp):
class FunASR (line 246) | class FunASR(AbstractASR):
method __init__ (line 253) | def __init__(self, inference_type, model_dir, **args):
method get_config (line 258) | def get_config(cls):
method transcribe (line 261) | def transcribe(self, fp):
class VolcengineASR (line 270) | class VolcengineASR(AbstractASR):
method __init__ (line 277) | def __init__(self, **kargs):
method get_config (line 282) | def get_config(cls):
method transcribe (line 285) | def transcribe(self, fp):
function get_engine_by_slug (line 294) | def get_engine_by_slug(slug=None):
function get_engines (line 323) | def get_engines():
FILE: robot/BCI.py
class MuseBCI (line 9) | class MuseBCI(object):
method __init__ (line 10) | def __init__(self, event):
method start (line 15) | def start(self):
method blink_handler (line 19) | def blink_handler(self, unused_addr, args, blink):
method jaw_clench_handler (line 26) | def jaw_clench_handler(self, unused_addr, args, jaw):
method _start_osc (line 33) | def _start_osc(self):
FILE: robot/Brain.py
class Brain (line 12) | class Brain(object):
method __init__ (line 13) | def __init__(self, conversation):
method match (line 24) | def match(self, patterns, text):
method isValid (line 30) | def isValid(self, plugin, text, parsed):
method isValidImmersive (line 37) | def isValidImmersive(self, plugin, text, parsed):
method isImmersive (line 44) | def isImmersive(self, plugin, text, parsed):
method printPlugins (line 50) | def printPlugins(self):
method query (line 56) | def query(self, text, parsed):
method restore (line 100) | def restore(self):
method pause (line 109) | def pause(self):
method understand (line 117) | def understand(self, fp):
method say (line 122) | def say(self, msg, cache=False):
FILE: robot/ConfigMonitor.py
class ConfigMonitor (line 10) | class ConfigMonitor(FileSystemEventHandler):
method __init__ (line 11) | def __init__(self, conversation):
method on_modified (line 16) | def on_modified(self, event):
FILE: robot/Conversation.py
class Conversation (line 37) | class Conversation(object):
method __init__ (line 38) | def __init__(self, profiling=False):
method _lastCompleted (line 59) | def _lastCompleted(self, index, onCompleted):
method _ttsAction (line 65) | def _ttsAction(self, msg, cache, index, onCompleted=None):
method getHistory (line 104) | def getHistory(self):
method interrupt (line 107) | def interrupt(self):
method reInit (line 113) | def reInit(self):
method checkRestore (line 126) | def checkRestore(self):
method _InGossip (line 132) | def _InGossip(self, query):
method doResponse (line 135) | def doResponse(self, query, UUID="", onSay=None, onStream=None):
method doParse (line 185) | def doParse(self, query):
method setImmersiveMode (line 195) | def setImmersiveMode(self, slug):
method getImmersiveMode (line 198) | def getImmersiveMode(self):
method converse (line 201) | def converse(self, fp, callback=None):
method doConverse (line 220) | def doConverse(self, fp, callback=None, onSay=None, onStream=None):
method appendHistory (line 235) | def appendHistory(self, t, text, UUID="", plugin=""):
method _onCompleted (line 267) | def _onCompleted(self, msg):
method pardon (line 270) | def pardon(self):
method _tts_line (line 278) | def _tts_line(self, line, cache, index=0, onCompleted=None):
method _tts (line 297) | def _tts(self, lines, cache, onCompleted=None):
method _after_play (line 329) | def _after_play(self, msg, audios, plugin=""):
method stream_say (line 340) | def stream_say(self, stream, cache=False, onCompleted=None):
method say (line 382) | def say(self, msg, cache=False, plugin="", onCompleted=None, append_hi...
method activeListen (line 408) | def activeListen(self, silent=False):
method play (line 441) | def play(self, src, delete=False, onCompleted=None, volume=1):
FILE: robot/LifeCycleHandler.py
function singleton (line 19) | def singleton(cls):
class LifeCycleHandler (line 37) | class LifeCycleHandler(object):
method __init__ (line 38) | def __init__(self, conversation):
method onInit (line 44) | def onInit(self):
method _read_reminders (line 67) | def _read_reminders(self):
method _init_unihiker (line 88) | def _init_unihiker(self):
method _init_LED (line 99) | def _init_LED(self):
method _init_muse (line 103) | def _init_muse(self):
method _unihiker_shake_event (line 115) | def _unihiker_shake_event(self):
method _aiy_button_event (line 129) | def _aiy_button_event(self):
method _muse_loop_event (line 146) | def _muse_loop_event(self):
method _beep_hi (line 158) | def _beep_hi(self, onCompleted=None):
method _beep_lo (line 161) | def _beep_lo(self):
method onWakeup (line 164) | def onWakeup(self, onCompleted=None):
method onThink (line 175) | def onThink(self):
method onResponse (line 186) | def onResponse(self, t=1, text=""):
method onRestore (line 198) | def onRestore(self):
method onKilled (line 204) | def onKilled(self):
FILE: robot/NLU.py
class AbstractNLU (line 9) | class AbstractNLU(object):
method get_config (line 17) | def get_config(cls):
method get_instance (line 21) | def get_instance(cls):
method parse (line 27) | def parse(self, query, **args):
method getIntent (line 37) | def getIntent(self, parsed):
method hasIntent (line 47) | def hasIntent(self, parsed, intent):
method getSlots (line 58) | def getSlots(self, parsed, intent):
method getSlotWords (line 70) | def getSlotWords(self, parsed, intent, name):
method getSay (line 82) | def getSay(self, parsed, intent):
class UnitNLU (line 93) | class UnitNLU(AbstractNLU):
method __init__ (line 100) | def __init__(self):
method get_config (line 104) | def get_config(cls):
method parse (line 112) | def parse(self, query, **args):
method getIntent (line 134) | def getIntent(self, parsed):
method hasIntent (line 143) | def hasIntent(self, parsed, intent):
method getSlots (line 153) | def getSlots(self, parsed, intent):
method getSlotWords (line 164) | def getSlotWords(self, parsed, intent, name):
method getSlotOriginalWords (line 175) | def getSlotOriginalWords(self, parsed, intent, name):
method getSay (line 186) | def getSay(self, parsed, intent):
function get_engine_by_slug (line 197) | def get_engine_by_slug(slug=None):
function get_engines (line 226) | def get_engines():
FILE: robot/Player.py
function py_error_handler (line 19) | def py_error_handler(filename, line, function, err, fmt):
function no_alsa_error (line 29) | def no_alsa_error():
function play (line 40) | def play(fname, onCompleted=None):
function getPlayerByFileName (line 45) | def getPlayerByFileName(fname):
class AbstractPlayer (line 51) | class AbstractPlayer(object):
method __init__ (line 52) | def __init__(self, **kwargs):
method play (line 55) | def play(self):
method play_block (line 58) | def play_block(self):
method stop (line 61) | def stop(self):
method is_playing (line 64) | def is_playing(self):
method join (line 67) | def join(self):
class SoxPlayer (line 71) | class SoxPlayer(AbstractPlayer):
method __init__ (line 74) | def __init__(self, **kwargs):
method executeOnCompleted (line 89) | def executeOnCompleted(self, res, onCompleted):
method playLoop (line 96) | def playLoop(self):
method doPlay (line 110) | def doPlay(self, src):
method play (line 128) | def play(self, src, delete=False, onCompleted=None):
method preappendCompleted (line 135) | def preappendCompleted(self, onCompleted):
method appendOnCompleted (line 138) | def appendOnCompleted(self, onCompleted):
method play_block (line 141) | def play_block(self):
method stop (line 144) | def stop(self):
method is_playing (line 155) | def is_playing(self):
method join (line 158) | def join(self):
method _clear_queue (line 161) | def _clear_queue(self):
class MusicPlayer (line 166) | class MusicPlayer(SoxPlayer):
method __init__ (line 175) | def __init__(self, playlist, plugin, **kwargs):
method update_playlist (line 182) | def update_playlist(self, playlist):
method play (line 188) | def play(self):
method next (line 194) | def next(self):
method prev (line 200) | def prev(self):
method pause (line 206) | def pause(self):
method stop (line 212) | def stop(self):
method resume (line 221) | def resume(self):
method is_playing (line 228) | def is_playing(self):
method is_pausing (line 231) | def is_pausing(self):
method turnUp (line 234) | def turnUp(self):
method turnDown (line 269) | def turnDown(self):
FILE: robot/Scheduler.py
class Job (line 13) | class Job(object):
method __init__ (line 18) | def __init__(self, remind_time, original_time, content, describe, job_...
class Scheduler (line 26) | class Scheduler(object):
method __init__ (line 32) | def __init__(self, con):
method _get_datetime (line 38) | def _get_datetime(self, norm_str):
method _add_interval_job (line 46) | def _add_interval_job(self, alarm, job_id, norm_str):
method _parse_cron_rule (line 58) | def _parse_cron_rule(self, rule_str):
method _add_cron_job (line 92) | def _add_cron_job(self, alarm, job_id, norm_str):
method get_jobs (line 100) | def get_jobs(self):
method set_jobs (line 107) | def set_jobs(self, jobs):
method add_job (line 110) | def add_job(self, remind_time, original_time, content, onAlarm, job_id...
method has_job (line 152) | def has_job(self, job_id):
method del_job_by_id (line 155) | def del_job_by_id(self, job_id):
FILE: robot/TTS.py
class AbstractTTS (line 27) | class AbstractTTS(object):
method get_config (line 35) | def get_config(cls):
method get_instance (line 39) | def get_instance(cls):
method get_speech (line 45) | def get_speech(self, phrase):
class HanTTS (line 49) | class HanTTS(AbstractTTS):
method __init__ (line 82) | def __init__(self, voice="syllables", **args):
method get_config (line 87) | def get_config(cls):
method get_speech (line 91) | def get_speech(self, phrase):
class AzureTTS (line 151) | class AzureTTS(AbstractTTS):
method __init__ (line 158) | def __init__(
method get_config (line 182) | def get_config(cls):
method get_speech (line 186) | def get_speech(self, phrase):
class BaiduTTS (line 202) | class BaiduTTS(AbstractTTS):
method __init__ (line 221) | def __init__(self, appid, api_key, secret_key, per=1, lan="zh", **args):
method get_config (line 227) | def get_config(cls):
method get_speech (line 231) | def get_speech(self, phrase):
class TencentTTS (line 242) | class TencentTTS(AbstractTTS):
method __init__ (line 258) | def __init__(
method get_config (line 273) | def get_config(cls):
method get_speech (line 277) | def get_speech(self, phrase):
class XunfeiTTS (line 289) | class XunfeiTTS(AbstractTTS):
method __init__ (line 296) | def __init__(self, appid, api_key, api_secret, voice="xiaoyan"):
method get_config (line 306) | def get_config(cls):
method get_speech (line 310) | def get_speech(self, phrase):
class AliTTS (line 316) | class AliTTS(AbstractTTS):
method __init__ (line 325) | def __init__(self, appKey, token, voice="xiaoyun", **args):
method get_config (line 330) | def get_config(cls):
method get_speech (line 334) | def get_speech(self, phrase):
class EdgeTTS (line 343) | class EdgeTTS(AbstractTTS):
method __init__ (line 352) | def __init__(self, voice="zh-CN-XiaoxiaoNeural", **args):
method get_config (line 357) | def get_config(cls):
method async_get_speech (line 361) | async def async_get_speech(self, phrase):
method get_speech (line 372) | def get_speech(self, phrase):
class MacTTS (line 380) | class MacTTS(AbstractTTS):
method __init__ (line 390) | def __init__(self, voice="Tingting", **args):
method get_config (line 395) | def get_config(cls):
method get_speech (line 399) | def get_speech(self, phrase):
class VITS (line 412) | class VITS(AbstractTTS):
method __init__ (line 428) | def __init__(self, server_url, api_key, speaker_id, length, noise, noi...
method get_config (line 434) | def get_config(cls):
method get_speech (line 437) | def get_speech(self, phrase):
function get_engine_by_slug (line 444) | def get_engine_by_slug(slug=None):
class VolcengineTTS (line 472) | class VolcengineTTS(AbstractTTS):
method __init__ (line 479) | def __init__(self, appid, token, cluster, voice_type, **args):
method get_config (line 484) | def get_config(cls):
method get_speech (line 488) | def get_speech(self, text):
function get_engines (line 499) | def get_engines():
FILE: robot/Updater.py
class Updater (line 17) | class Updater(object):
method __init__ (line 18) | def __init__(self):
method _pull (line 22) | def _pull(self, cwd, tag):
method _pip (line 36) | def _pip(self, cwd):
method update (line 48) | def update(self):
method _get_version (line 73) | def _get_version(self, path, current):
method fetch (line 80) | def fetch(self):
function fetch (line 112) | def fetch():
FILE: robot/config.py
function reload (line 13) | def reload():
function init (line 21) | def init():
function doInit (line 39) | def doInit(config_file=constants.getDefaultConfigPath()):
function get_path (line 70) | def get_path(items, default=None, warn=False):
function has_path (line 95) | def has_path(items):
function has (line 110) | def has(item):
function get (line 120) | def get(item="", default=None, warn=False):
function getConfig (line 150) | def getConfig():
function getText (line 159) | def getText():
function dump (line 166) | def dump(configStr):
FILE: robot/constants.py
function getConfigPath (line 23) | def getConfigPath():
function getQAPath (line 32) | def getQAPath():
function getConfigData (line 45) | def getConfigData(*fname):
function getData (line 55) | def getData(*fname):
function getDefaultConfigPath (line 65) | def getDefaultConfigPath():
function newConfig (line 69) | def newConfig():
function getHotwordModel (line 73) | def getHotwordModel(fname):
FILE: robot/detector.py
function initDetector (line 13) | def initDetector(wukong):
FILE: robot/drivers/AIY.py
class AIY (line 4) | class AIY:
method __init__ (line 5) | def __init__(self):
method wakeup (line 9) | def wakeup(self):
method think (line 22) | def think(self):
method off (line 33) | def off(self):
FILE: robot/drivers/apa102.py
class APA102 (line 18) | class APA102:
method __init__ (line 85) | def __init__(
method clock_start_frame (line 110) | def clock_start_frame(self):
method clock_end_frame (line 118) | def clock_end_frame(self):
method clear_strip (line 149) | def clear_strip(self):
method set_pixel (line 156) | def set_pixel(self, led_num, red, green, blue, bright_percent=100):
method set_pixel_rgb (line 183) | def set_pixel_rgb(self, led_num, rgb_color, bright_percent=100):
method rotate (line 199) | def rotate(self, positions=1):
method show (line 209) | def show(self):
method cleanup (line 220) | def cleanup(self):
method combine_color (line 226) | def combine_color(red, green, blue):
method wheel (line 231) | def wheel(self, wheel_pos):
method dump_array (line 245) | def dump_array(self):
FILE: robot/drivers/pixels.py
class Pixels (line 11) | class Pixels:
method __init__ (line 14) | def __init__(self):
method wakeup (line 29) | def wakeup(self, direction=0):
method listen (line 36) | def listen(self):
method think (line 40) | def think(self):
method speak (line 44) | def speak(self):
method off (line 48) | def off(self):
method _run (line 52) | def _run(self):
method _wakeup (line 57) | def _wakeup(self, direction=0):
method _listen (line 65) | def _listen(self):
method _think (line 73) | def _think(self):
method _speak (line 93) | def _speak(self):
method _off (line 114) | def _off(self):
method write (line 117) | def write(self, colors):
FILE: robot/logging.py
function tail (line 15) | def tail(filepath, n=10):
function getLogger (line 47) | def getLogger(name):
function readLog (line 72) | def readLog(lines=200):
FILE: robot/plugin_loader.py
function init_plugins (line 15) | def init_plugins(con):
function get_plugins (line 73) | def get_plugins(con):
FILE: robot/sdk/AbstractPlugin.py
class AbstractPlugin (line 14) | class AbstractPlugin(metaclass=ABCMeta):
method __init__ (line 20) | def __init__(self, con):
method play (line 29) | def play(self, src, delete=False, onCompleted=None, volume=1):
method say (line 40) | def say(self, text, cache=False, onCompleted=None, wait=False):
method activeListen (line 51) | def activeListen(self, silent=False):
method clearImmersive (line 64) | def clearImmersive(self):
method parse (line 67) | def parse(self, query):
method isValid (line 74) | def isValid(self, query, parsed):
method handle (line 89) | def handle(self, query, parsed):
method isValidImmersive (line 99) | def isValidImmersive(self, query, parsed):
method pause (line 108) | def pause(self):
method restore (line 117) | def restore(self):
FILE: robot/sdk/AliSpeech.py
function processGETRequest (line 12) | def processGETRequest(appKey, token, voice, text, format, sampleRate):
function processPOSTRequest (line 43) | def processPOSTRequest(appKey, token, voice, text, format, sampleRate):
function process (line 82) | def process(request, token, audioContent):
function tts (line 117) | def tts(appKey, token, voice, text):
function asr (line 129) | def asr(appKey, token, wave_file):
FILE: robot/sdk/BaiduSpeech.py
class baiduSpeech (line 12) | class baiduSpeech(object):
method __init__ (line 13) | def __init__(self, api_key, secret_key, dev_pid):
method fetch_token (line 20) | def fetch_token(self):
method load (line 50) | def load(self):
method asr (line 73) | def asr(self, pcm, file_type, sample_rate, dev_pid):
FILE: robot/sdk/FunASREngine.py
class funASREngine (line 5) | class funASREngine(object):
method __init__ (line 6) | def __init__(self, inference_type, model_dir=''):
method onnxruntime_engine (line 14) | def onnxruntime_engine(self, audio_path):
method __call__ (line 18) | def __call__(self, fp):
FILE: robot/sdk/History.py
function Singleton (line 6) | def Singleton(cls):
class History (line 18) | class History(object):
method __init__ (line 19) | def __init__(self):
method get_messages_since (line 25) | def get_messages_since(self, cursor):
method add_message (line 38) | def add_message(self, message):
FILE: robot/sdk/LED.py
function wakeup (line 10) | def wakeup():
function think (line 22) | def think():
function off (line 34) | def off():
FILE: robot/sdk/RASRsdk.py
function formatSignString (line 12) | def formatSignString(param):
function sign (line 33) | def sign(signstr, secret_key):
function randstr (line 41) | def randstr(n):
function sendVoice (line 51) | def sendVoice(
FILE: robot/sdk/TencentSpeech.py
class tencentSpeech (line 18) | class tencentSpeech(object):
method __init__ (line 31) | def __init__(self, SECRET_KEY, SECRET_ID):
method secret_id (line 35) | def secret_id(self):
method secret_id (line 39) | def secret_id(self, SECRET_ID):
method secret_key (line 47) | def secret_key(self):
method secret_key (line 51) | def secret_key(self, SECRET_KEY):
method source_type (line 59) | def source_type(self):
method source_type (line 63) | def source_type(self, SourceType):
method url (line 71) | def url(self):
method url (line 75) | def url(self, URL):
method voiceformat (line 83) | def voiceformat(self):
method voiceformat (line 87) | def voiceformat(self, VoiceFormat):
method text (line 95) | def text(self):
method text (line 99) | def text(self, Text):
method region (line 107) | def region(self):
method region (line 111) | def region(self, Region):
method primarylanguage (line 119) | def primarylanguage(self):
method primarylanguage (line 123) | def primarylanguage(self, PrimaryLanguage):
method voicetype (line 127) | def voicetype(self):
method voicetype (line 131) | def voicetype(self, VoiceType):
method TTS (line 134) | def TTS(self, text, voicetype, primarylanguage, region):
method textToSpeech (line 143) | def textToSpeech(self):
method ASR (line 184) | def ASR(self, URL, voiceformat, sourcetype, region):
method oneSentenceRecognition (line 193) | def oneSentenceRecognition(self):
method formatSignString (line 246) | def formatSignString(self, config_dict):
method encode_sign (line 255) | def encode_sign(self, signstr, SECRET_KEY):
FILE: robot/sdk/Unihiker.py
class Unihiker (line 7) | class Unihiker(object):
method __init__ (line 8) | def __init__(self):
method _play_tones (line 20) | def _play_tones(self, tones, duration):
method wakeup (line 27) | def wakeup(self):
method think (line 31) | def think(self):
method record (line 35) | def record(self, t, text=""):
FILE: robot/sdk/VITSClient.py
function tts (line 9) | def tts(text, server_url, api_key, speaker_id, length, noise, noisew, ma...
FILE: robot/sdk/VolcengineSpeech.py
function generate_header (line 70) | def generate_header(
function generate_full_default_header (line 96) | def generate_full_default_header():
function generate_audio_default_header (line 100) | def generate_audio_default_header():
function generate_last_audio_default_header (line 106) | def generate_last_audio_default_header():
function parse_response (line 112) | def parse_response(res):
function read_wav_info (line 160) | def read_wav_info(data: bytes = None):
class AudioType (line 167) | class AudioType(Enum):
class AsrWsClient (line 170) | class AsrWsClient:
method __init__ (line 171) | def __init__(self, audio_path, cluster, **kwargs):
method construct_request (line 199) | def construct_request(self, reqid):
method slice_data (line 230) | def slice_data(data: bytes, chunk_size: int):
method _real_processor (line 245) | def _real_processor(self, request_params: dict) -> dict:
method token_auth (line 248) | def token_auth(self):
method signature_auth (line 251) | def signature_auth(self, data):
method segment_data_processor (line 269) | async def segment_data_processor(self, wav_data: bytes, segment_size: ...
method execute (line 306) | async def execute(self):
class VolcengineASR (line 321) | class VolcengineASR(object):
method __init__ (line 322) | def __init__(self, **kwargs) -> None:
method execute (line 327) | def execute(self, path):
class VolcengineTTS (line 349) | class VolcengineTTS(object):
method __init__ (line 350) | def __init__(self, appid, token, cluster, voice_type) -> None:
method execute (line 353) | def execute(self, text):
FILE: robot/sdk/XunfeiSpeech.py
class ASR_Ws_Param (line 31) | class ASR_Ws_Param(object):
method __init__ (line 33) | def __init__(self, APPID, APIKey, APISecret, AudioFile):
method create_url (line 46) | def create_url(self):
class TTS_Ws_Param (line 80) | class TTS_Ws_Param(object):
method __init__ (line 82) | def __init__(self, APPID, APIKey, APISecret, Text, voice_name="xiaoyan"):
method create_url (line 103) | def create_url(self):
function asr_on_message (line 140) | def asr_on_message(ws, message):
function asr_on_error (line 168) | def asr_on_error(ws, error):
function asr_on_close (line 173) | def asr_on_close(ws, _foo, _bar):
function asr_on_open (line 178) | def asr_on_open(ws):
function tts_on_message (line 241) | def tts_on_message(ws, message):
function tts_on_error (line 258) | def tts_on_error(ws, error):
function tts_on_close (line 263) | def tts_on_close(ws, _foo, _bar):
function tts_on_open (line 282) | def tts_on_open(ws):
function transcribe (line 302) | def transcribe(fpath, appid, api_key, api_secret):
function synthesize (line 319) | def synthesize(msg, appid, api_key, api_secret, voice_name="xiaoyan"):
FILE: robot/sdk/atc.py
function num2chinese (line 59) | def num2chinese(num, big=False, simp=True, o=False, twoalt=False):
FILE: robot/sdk/unit.py
function get_token (line 14) | def get_token(api_key, secret_key):
function getUnit (line 43) | def getUnit(query, service_id, api_key, secret_key):
function getIntent (line 74) | def getIntent(parsed):
function hasIntent (line 91) | def hasIntent(parsed, intent):
function getSlots (line 113) | def getSlots(parsed, intent=""):
function getSlotWords (line 143) | def getSlotWords(parsed, intent, name):
function getSlotOriginalWords (line 160) | def getSlotOriginalWords(parsed, intent, name):
function getSayByConfidence (line 177) | def getSayByConfidence(parsed):
function getSay (line 203) | def getSay(parsed, intent=""):
FILE: robot/statistic.py
function getUUID (line 9) | def getUUID():
function report (line 14) | def report(t):
class ReportThread (line 18) | class ReportThread(threading.Thread):
method __init__ (line 19) | def __init__(self, t):
method run (line 24) | def run(self):
FILE: robot/utils.py
function sendEmail (line 29) | def sendEmail(
function emailUser (line 78) | def emailUser(SUBJECT="", BODY="", ATTACH_LIST=[]):
function get_file_content (line 110) | def get_file_content(filePath, flag="rb"):
function check_and_delete (line 122) | def check_and_delete(fp, wait=0):
function write_temp_file (line 141) | def write_temp_file(data, suffix, mode="w+b"):
function get_pcm_from_wav (line 156) | def get_pcm_from_wav(wav_path):
function convert_wav_to_mp3 (line 167) | def convert_wav_to_mp3(wav_path):
function convert_mp3_to_wav (line 182) | def convert_mp3_to_wav(mp3_path):
function clean (line 197) | def clean():
function setRecordable (line 208) | def setRecordable(value):
function isRecordable (line 214) | def isRecordable():
function is_proper_time (line 220) | def is_proper_time():
function get_do_not_bother_on_hotword (line 241) | def get_do_not_bother_on_hotword():
function get_do_not_bother_off_hotword (line 246) | def get_do_not_bother_off_hotword():
function getTimezone (line 251) | def getTimezone():
function getTimemStap (line 256) | def getTimemStap():
function getCache (line 261) | def getCache(msg):
function saveCache (line 271) | def saveCache(voice, msg):
function lruCache (line 280) | def lruCache():
function validyaml (line 295) | def validyaml(filename):
function validjson (line 311) | def validjson(s):
function getPunctuations (line 325) | def getPunctuations():
function stripPunctuation (line 329) | def stripPunctuation(s):
FILE: server/server.py
class BaseHandler (line 42) | class BaseHandler(tornado.web.RequestHandler):
method isValidated (line 43) | def isValidated(self):
method validate (line 50) | def validate(self, validation):
class MainHandler (line 58) | class MainHandler(BaseHandler):
method get (line 59) | def get(self):
class MessageUpdatesHandler (line 81) | class MessageUpdatesHandler(BaseHandler):
method post (line 87) | async def post(self):
method on_connection_close (line 110) | def on_connection_close(self):
class ChatWebSocketHandler (line 119) | class ChatWebSocketHandler(WebSocketHandler, BaseHandler):
method open (line 122) | def open(self):
method on_close (line 125) | def on_close(self):
method send_response (line 128) | def send_response(self, msg, uuid, plugin=""):
class ChatHandler (line 139) | class ChatHandler(BaseHandler):
method onResp (line 140) | def onResp(self, msg, audio, plugin):
method onStream (line 155) | def onStream(self, data, uuid):
method post (line 160) | def post(self):
class GetHistoryHandler (line 204) | class GetHistoryHandler(BaseHandler):
method get (line 205) | def get(self):
class GetLogHandler (line 220) | class GetLogHandler(BaseHandler):
method get (line 221) | def get(self):
class LogPageHandler (line 232) | class LogPageHandler(BaseHandler):
method get (line 233) | def get(self):
class OperateHandler (line 240) | class OperateHandler(BaseHandler):
method post (line 241) | def post(self):
class ConfigPageHandler (line 261) | class ConfigPageHandler(BaseHandler):
method get (line 262) | def get(self):
class ConfigHandler (line 269) | class ConfigHandler(BaseHandler):
method get (line 270) | def get(self):
method post (line 289) | def post(self):
class DonateHandler (line 307) | class DonateHandler(BaseHandler):
method get (line 308) | def get(self):
class QAHandler (line 322) | class QAHandler(BaseHandler):
method get (line 323) | def get(self):
method post (line 332) | def post(self):
class APIHandler (line 364) | class APIHandler(BaseHandler):
method get (line 365) | def get(self):
class UpdateHandler (line 387) | class UpdateHandler(BaseHandler):
method post (line 388) | def post(self):
class LoginHandler (line 406) | class LoginHandler(BaseHandler):
method get (line 407) | def get(self):
method post (line 413) | def post(self):
class LogoutHandler (line 428) | class LogoutHandler(BaseHandler):
method get (line 429) | def get(self):
function start_server (line 483) | def start_server(con, wk):
function run (line 497) | def run(conversation, wukong, debug=False):
FILE: server/static/bootbox.js
function _t (line 94) | function _t(key) {
function processCallback (line 99) | function processCallback(e, dialog, callback) {
function getKeyLength (line 116) | function getKeyLength(obj) {
function each (line 125) | function each(collection, iterator) {
function sanitize (line 132) | function sanitize(options) {
function mapArguments (line 197) | function mapArguments(args, properties) {
function mergeArguments (line 218) | function mergeArguments(defaults, args, properties) {
function mergeDialogOptions (line 239) | function mergeDialogOptions(className, labels, properties, args) {
function createLabels (line 265) | function createLabels() {
function validateButtons (line 281) | function validateButtons(options, buttons) {
FILE: server/static/config.js
function saveConfig (line 1) | function saveConfig(msg) {
FILE: server/static/index.js
function appendHistory (line 18) | function appendHistory(type, message, uuid, plugin) {
function showProgress (line 52) | function showProgress() {
function upgrade (line 56) | function upgrade() {
function S4 (line 91) | function S4() {
function guid (line 94) | function guid() {
FILE: server/static/jquery.fancybox.js
function _run (line 2996) | function _run(e, opts) {
function escapeHtml (line 4822) | function escapeHtml(string) {
function parseUrl (line 4914) | function parseUrl() {
function triggerFromUrl (line 4929) | function triggerFromUrl(url) {
function getGalleryID (line 4942) | function getGalleryID(instance) {
FILE: server/static/log.js
function refresh (line 1) | function refresh(msg) {
FILE: server/static/main.js
function restart (line 3) | function restart() {
function renderMenu (line 22) | function renderMenu() {
function getCookie (line 31) | function getCookie(name)
function setCookie (line 41) | function setCookie(name,value)
function arrayBufferToBase64 (line 49) | function arrayBufferToBase64( buffer ) {
function showSpin (line 59) | function showSpin() {
function dismissSpin (line 86) | function dismissSpin() {
function Spinner (line 196) | function Spinner(opts) {
function css (line 249) | function css(el, props) {
function getColor (line 258) | function getColor(color, idx) {
function drawLines (line 264) | function drawLines(el, opts) {
function parseBoxShadow (line 300) | function parseBoxShadow(boxShadow) {
function normalizeShadow (line 336) | function normalizeShadow(shadows, degrees) {
function convertOffset (line 345) | function convertOffset(x, y, degrees) {
FILE: server/static/modernizr.touch.js
function v (line 4) | function v(a){i.cssText=a}
function w (line 4) | function w(a,b){return v(l.join(a+";")+(b||""))}
function x (line 4) | function x(a,b){return typeof a===b}
function y (line 4) | function y(a,b){return!!~(""+a).indexOf(b)}
function z (line 4) | function z(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a...
FILE: server/static/qa.js
function upload (line 1) | function upload() {
FILE: snowboy/snowboydecoder.py
function py_error_handler (line 23) | def py_error_handler(filename, line, function, err, fmt):
function no_alsa_error (line 33) | def no_alsa_error():
class RingBuffer (line 44) | class RingBuffer(object):
method __init__ (line 47) | def __init__(self, size=4096):
method extend (line 50) | def extend(self, data):
method get (line 54) | def get(self):
function play_audio_file (line 61) | def play_audio_file(fname=DETECT_DING):
class ActiveListener (line 87) | class ActiveListener(object):
method __init__ (line 90) | def __init__(self, decoder_model, resource=RESOURCE_FILE):
method listen (line 101) | def listen(
method saveMessage (line 192) | def saveMessage(self):
class HotwordDetector (line 221) | class HotwordDetector(object):
method __init__ (line 236) | def __init__(
method start (line 277) | def start(
method saveMessage (line 412) | def saveMessage(self):
method terminate (line 435) | def terminate(self):
FILE: snowboy/snowboydetect.py
function swig_import_helper (line 11) | def swig_import_helper():
function swig_import_helper (line 25) | def swig_import_helper():
function _swig_setattr_nondynamic (line 61) | def _swig_setattr_nondynamic(self, class_type, name, value, static=1):
function _swig_setattr (line 80) | def _swig_setattr(self, class_type, name, value):
function _swig_getattr (line 84) | def _swig_getattr(self, class_type, name):
function _swig_repr (line 95) | def _swig_repr(self):
class _object (line 112) | class _object:
class SnowboyDetect (line 118) | class SnowboyDetect(_object):
method __init__ (line 127) | def __init__(self, resource_filename, model_str):
method Reset (line 134) | def Reset(self):
method RunDetection (line 137) | def RunDetection(self, *args):
method SetSensitivity (line 140) | def SetSensitivity(self, sensitivity_str):
method SetHighSensitivity (line 143) | def SetHighSensitivity(self, high_sensitivity_str):
method GetSensitivity (line 148) | def GetSensitivity(self):
method SetAudioGain (line 151) | def SetAudioGain(self, audio_gain):
method UpdateModel (line 154) | def UpdateModel(self):
method NumHotwords (line 157) | def NumHotwords(self):
method ApplyFrontend (line 160) | def ApplyFrontend(self, apply_frontend):
method SampleRate (line 163) | def SampleRate(self):
method NumChannels (line 166) | def NumChannels(self):
method BitsPerSample (line 169) | def BitsPerSample(self):
class SnowboyVad (line 180) | class SnowboyVad(_object):
method __init__ (line 187) | def __init__(self, resource_filename):
method Reset (line 194) | def Reset(self):
method RunVad (line 197) | def RunVad(self, *args):
method SetAudioGain (line 200) | def SetAudioGain(self, audio_gain):
method ApplyFrontend (line 203) | def ApplyFrontend(self, apply_frontend):
method SampleRate (line 206) | def SampleRate(self):
method NumChannels (line 209) | def NumChannels(self):
method BitsPerSample (line 212) | def BitsPerSample(self):
FILE: tools/make_json.py
function write_format_file (line 22) | def write_format_file(fields, format_file_str):
function run (line 43) | def run(faq_file_str, json_file_str):
function convert (line 79) | def convert(faq_str, json_file_str):
FILE: tools/solr_tools.py
function _make_smart_hint (line 31) | def _make_smart_hint(hint_type, hint_content):
function _get_error_message (line 38) | def _get_error_message(respond_str):
function add_engine (line 45) | def add_engine(
function delete_engine (line 70) | def delete_engine(host, enginename, port=8983):
function upload_documents (line 89) | def upload_documents(host, enginename, port=8983, documents="", num_thre...
function clear_documents (line 176) | def clear_documents(host, enginename, port=8983):
function help (line 195) | def help(**kwargs):
function call_function (line 222) | def call_function(func, params):
function command_line_tools (line 229) | def command_line_tools():
FILE: wukong.py
class Wukong (line 24) | class Wukong(object):
method init (line 29) | def init(self):
method _signal_handler (line 60) | def _signal_handler(self, signal, frame):
method _detected_callback (line 65) | def _detected_callback(self, is_snowboy=True):
method _interrupt_callback (line 84) | def _interrupt_callback(self):
method run (line 87) | def run(self):
method help (line 100) | def help(self):
method md5 (line 114) | def md5(self, password):
method update (line 120) | def update(self):
method fetch (line 127) | def fetch(self):
method upload (line 134) | def upload(self, threadNum=10):
method restart (line 156) | def restart(self):
method profiling (line 168) | def profiling(self):
method debug (line 176) | def debug(self):
Condensed preview — 209 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,956K chars).
[
{
"path": ".github/FUNDING.yml",
"chars": 573,
"preview": "# These are supported funding model platforms\n\ngithub: #'wzpan'\npatreon: # Replace with a single Patreon username\nopen_c"
},
{
"path": ".github/ISSUE_TEMPLATE/----.md",
"chars": 619,
"preview": "---\nname: 使用求助\nabout: 使用遇到问题,请求帮助\ntitle: ''\nlabels: operation problem\nassignees: wzpan\n\n---\n\n**确认已寻找过答案**\n\n我已确认在 [Github"
},
{
"path": ".github/ISSUE_TEMPLATE/bug---.md",
"chars": 642,
"preview": "---\nname: Bug 反馈\nabout: 反馈一个bug,帮助改进 wukong-robot\ntitle: ''\nlabels: bug\nassignees: wzpan\n\n---\n\n**确认已寻找过答案**\n\n我已确认在 [Gith"
},
{
"path": ".github/stale.yml",
"chars": 569,
"preview": "# Number of days of inactivity before an issue becomes stale\ndaysUntilStale: 7\n# Number of days of inactivity before a s"
},
{
"path": ".github/workflows/dockerimage.yml",
"chars": 815,
"preview": "name: Docker Image CI\n\non:\n push:\n branches:\n - master\n\njobs:\n\n build:\n \n runs-on: ubuntu-latest\n \n steps:"
},
{
"path": ".gitignore",
"chars": 1055,
"preview": "# Generic files to ignore\n*~\n*.lock\n*.DS_Store\n*.swp\n*.out\n\n# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[co"
},
{
"path": ".travis.yml",
"chars": 255,
"preview": "env:\n - ARCH=x86\nlanguage: python\nsudo: false\npython:\n - \"3.5\"\ncache:\n directories:\n - \"$HOME/.pip-cache/\"\n "
},
{
"path": "LICENSE",
"chars": 1078,
"preview": "MIT License\n\nCopyright (c) 2016 - present Weizhou Pan\n\nPermission is hereby granted, free of charge, to any person obtai"
},
{
"path": "README.md",
"chars": 10017,
"preview": "# wukong-robot\n\n<p align=\"center\">\n <a href=\"https://wukong.hahack.com\" target=\"_blank\">\n <img width=\"128\" src=\"http"
},
{
"path": "VERSION",
"chars": 6,
"preview": "3.5.3\n"
},
{
"path": "docker/Dockerfile",
"chars": 1053,
"preview": "# 使用官方 Python 3.8 基础镜像\nFROM python:3.8-slim\n\n# 设置工作目录\nWORKDIR /app\n\n# 安装依赖库\nRUN apt-get update && apt-get install -y \\\n "
},
{
"path": "docker/DockerfileArm",
"chars": 1102,
"preview": "# 使用官方 Python 3.8 基于 ARM 的镜像\nFROM arm32v7/python:3.8-slim\n\nMAINTAINER wzpan\n\n# 设置工作目录\nWORKDIR /app\n\n# 安装依赖库\nRUN apt-get "
},
{
"path": "docs/.buildinfo",
"chars": 230,
"preview": "# Sphinx build info version 1\n# This file hashes the configuration used when building these files. When it is not found,"
},
{
"path": "docs/.nojekyll",
"chars": 0,
"preview": ""
},
{
"path": "docs/AI.html",
"chars": 4104,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/ASR.html",
"chars": 4111,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/Brain.html",
"chars": 4125,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/ConfigMonitor.html",
"chars": 4181,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/Conversation.html",
"chars": 4174,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/Player.html",
"chars": 4132,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/TTS.html",
"chars": 4111,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/Updater.html",
"chars": 4139,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/index.html",
"chars": 5720,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/logging.html",
"chars": 240475,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/plugins/Camera.html",
"chars": 20426,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/plugins/CleanCache.html",
"chars": 7494,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/plugins/Echo.html",
"chars": 7025,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/plugins/Email.html",
"chars": 34315,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/plugins/Geek.html",
"chars": 14395,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/plugins/LocalPlayer.html",
"chars": 21697,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/plugins/Poem.html",
"chars": 7679,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/robot/AI.html",
"chars": 31627,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/robot/ASR.html",
"chars": 32785,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/robot/Brain.html",
"chars": 19958,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/robot/ConfigMonitor.html",
"chars": 6107,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/robot/Conversation.html",
"chars": 49211,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/robot/NLU.html",
"chars": 26269,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/robot/Player.html",
"chars": 46290,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/robot/TTS.html",
"chars": 42346,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/robot/Updater.html",
"chars": 23844,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/robot/config.html",
"chars": 22847,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/robot/constants.html",
"chars": 12828,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/robot/drivers/apa102.html",
"chars": 33587,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/robot/drivers/pixels.html",
"chars": 25271,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/robot/logging.html",
"chars": 13784,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/robot/plugin_loader.html",
"chars": 14221,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/robot/sdk/AbstractPlugin.html",
"chars": 15207,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/robot/sdk/AliSpeech.html",
"chars": 28409,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/robot/sdk/RASRsdk.html",
"chars": 28820,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/robot/sdk/TencentSpeech.html",
"chars": 41768,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/robot/sdk/XunfeiSpeech.html",
"chars": 31796,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/robot/sdk/unit.html",
"chars": 25037,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/robot/statistic.html",
"chars": 9500,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/robot/utils.html",
"chars": 40838,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/snowboy/snowboydecoder.html",
"chars": 63211,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/snowboy/snowboydetect.html",
"chars": 35701,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_modules/wukong.html",
"chars": 28858,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/_sources/AI.rst.txt",
"chars": 97,
"preview": "AI module\n=========\n\n.. automodule:: AI\n :members:\n :undoc-members:\n :show-inheritance:\n"
},
{
"path": "docs/_sources/ASR.rst.txt",
"chars": 100,
"preview": "ASR module\n==========\n\n.. automodule:: ASR\n :members:\n :undoc-members:\n :show-inheritance:\n"
},
{
"path": "docs/_sources/Brain.rst.txt",
"chars": 106,
"preview": "Brain module\n============\n\n.. automodule:: Brain\n :members:\n :undoc-members:\n :show-inheritance:\n"
},
{
"path": "docs/_sources/ConfigMonitor.rst.txt",
"chars": 130,
"preview": "ConfigMonitor module\n====================\n\n.. automodule:: ConfigMonitor\n :members:\n :undoc-members:\n :show-inh"
},
{
"path": "docs/_sources/Conversation.rst.txt",
"chars": 127,
"preview": "Conversation module\n===================\n\n.. automodule:: Conversation\n :members:\n :undoc-members:\n :show-inheri"
},
{
"path": "docs/_sources/Player.rst.txt",
"chars": 109,
"preview": "Player module\n=============\n\n.. automodule:: Player\n :members:\n :undoc-members:\n :show-inheritance:\n"
},
{
"path": "docs/_sources/TTS.rst.txt",
"chars": 100,
"preview": "TTS module\n==========\n\n.. automodule:: TTS\n :members:\n :undoc-members:\n :show-inheritance:\n"
},
{
"path": "docs/_sources/Updater.rst.txt",
"chars": 112,
"preview": "Updater module\n==============\n\n.. automodule:: Updater\n :members:\n :undoc-members:\n :show-inheritance:\n"
},
{
"path": "docs/_sources/config.rst.txt",
"chars": 109,
"preview": "config module\n=============\n\n.. automodule:: config\n :members:\n :undoc-members:\n :show-inheritance:\n"
},
{
"path": "docs/_sources/constants.rst.txt",
"chars": 118,
"preview": "constants module\n================\n\n.. automodule:: constants\n :members:\n :undoc-members:\n :show-inheritance:\n"
},
{
"path": "docs/_sources/drivers.rst.txt",
"chars": 439,
"preview": "drivers package\n===============\n\nSubmodules\n----------\n\ndrivers.apa102 module\n---------------------\n\n.. automodule:: dri"
},
{
"path": "docs/_sources/index.rst.txt",
"chars": 488,
"preview": ".. wukong-robot documentation master file, created by\n sphinx-quickstart on Sun Feb 17 01:03:29 2019.\n You can adapt"
},
{
"path": "docs/_sources/logging.rst.txt",
"chars": 112,
"preview": "logging module\n==============\n\n.. automodule:: logging\n :members:\n :undoc-members:\n :show-inheritance:\n"
},
{
"path": "docs/_sources/modules.rst.txt",
"chars": 98,
"preview": "wukong-robot\n============\n\n.. toctree::\n :maxdepth: 4\n\n plugins\n robot\n snowboy\n wukong\n"
},
{
"path": "docs/_sources/plugin_loader.rst.txt",
"chars": 132,
"preview": "plugin\\_loader module\n=====================\n\n.. automodule:: plugin_loader\n :members:\n :undoc-members:\n :show-i"
},
{
"path": "docs/_sources/plugins.rst.txt",
"chars": 1115,
"preview": "plugins package\n===============\n\nSubmodules\n----------\n\nplugins.Camera module\n---------------------\n\n.. automodule:: plu"
},
{
"path": "docs/_sources/robot.drivers.rst.txt",
"chars": 493,
"preview": "robot.drivers package\n=====================\n\nSubmodules\n----------\n\nrobot.drivers.apa102 module\n------------------------"
},
{
"path": "docs/_sources/robot.rst.txt",
"chars": 2180,
"preview": "robot package\n=============\n\nSubpackages\n-----------\n\n.. toctree::\n\n robot.sdk\n\nSubmodules\n----------\n\nrobot.AI modul"
},
{
"path": "docs/_sources/robot.sdk.rst.txt",
"chars": 1086,
"preview": "robot.sdk package\n=================\n\nSubmodules\n----------\n\nrobot.sdk.AbstractPlugin module\n----------------------------"
},
{
"path": "docs/_sources/snowboy.rst.txt",
"chars": 484,
"preview": "snowboy package\n===============\n\nSubmodules\n----------\n\nsnowboy.snowboydecoder module\n-----------------------------\n\n.. "
},
{
"path": "docs/_sources/statistic.rst.txt",
"chars": 118,
"preview": "statistic module\n================\n\n.. automodule:: statistic\n :members:\n :undoc-members:\n :show-inheritance:\n"
},
{
"path": "docs/_sources/utils.rst.txt",
"chars": 106,
"preview": "utils module\n============\n\n.. automodule:: utils\n :members:\n :undoc-members:\n :show-inheritance:\n"
},
{
"path": "docs/_sources/wukong.rst.txt",
"chars": 109,
"preview": "wukong module\n=============\n\n.. automodule:: wukong\n :members:\n :undoc-members:\n :show-inheritance:\n"
},
{
"path": "docs/_static/alabaster.css",
"chars": 11185,
"preview": "@import url(\"basic.css\");\n\n/* -- page layout ----------------------------------------------------------- */\n\nbody {\n "
},
{
"path": "docs/_static/basic.css",
"chars": 10912,
"preview": "/*\n * basic.css\n * ~~~~~~~~~\n *\n * Sphinx stylesheet -- basic theme.\n *\n * :copyright: Copyright 2007-2019 by the Sphinx"
},
{
"path": "docs/_static/css/badge_only.css",
"chars": 3369,
"preview": ".fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:"
},
{
"path": "docs/_static/css/theme.css",
"chars": 116986,
"preview": "/* sphinx_rtd_theme version 0.4.3 | MIT license */\n/* Built 20190212 16:02 */\n*{-webkit-box-sizing:border-box;-moz-box-s"
},
{
"path": "docs/_static/custom.css",
"chars": 42,
"preview": "/* This file intentionally left blank. */\n"
},
{
"path": "docs/_static/doctools.js",
"chars": 9313,
"preview": "/*\n * doctools.js\n * ~~~~~~~~~~~\n *\n * Sphinx JavaScript utilities for all documentation.\n *\n * :copyright: Copyright 20"
},
{
"path": "docs/_static/documentation_options.js",
"chars": 310,
"preview": "var DOCUMENTATION_OPTIONS = {\n URL_ROOT: document.getElementById(\"documentation_options\").getAttribute('data-url_root"
},
{
"path": "docs/_static/jquery-3.2.1.js",
"chars": 268039,
"preview": "/*!\n * jQuery JavaScript Library v3.2.1\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * C"
},
{
"path": "docs/_static/jquery.js",
"chars": 86659,
"preview": "/*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */\n!function(a,b){\"use strict\";\"object"
},
{
"path": "docs/_static/js/theme.js",
"chars": 4414,
"preview": "/* sphinx_rtd_theme version 0.4.3 | MIT license */\n/* Built 20190212 16:02 */\nrequire=function r(s,a,l){function c(e,n){"
},
{
"path": "docs/_static/language_data.js",
"chars": 10847,
"preview": "/*\n * language_data.js\n * ~~~~~~~~~~~~~~~~\n *\n * This script contains the language-specific data used by searchtools.js,"
},
{
"path": "docs/_static/pygments.css",
"chars": 4368,
"preview": ".highlight .hll { background-color: #ffffcc }\n.highlight { background: #f8f8f8; }\n.highlight .c { color: #408080; font-"
},
{
"path": "docs/_static/searchtools.js",
"chars": 15059,
"preview": "/*\n * searchtools.js\n * ~~~~~~~~~~~~~~~~\n *\n * Sphinx JavaScript utilities for the full-text search.\n *\n * :copyright: C"
},
{
"path": "docs/_static/translations.js",
"chars": 4643,
"preview": "Documentation.addTranslations({\"locale\": \"zh_Hans_CN\", \"messages\": {\"%(filename)s — %(docstitle)s\": \"%(filename)s "
},
{
"path": "docs/_static/underscore-1.3.1.js",
"chars": 35168,
"preview": "// Underscore.js 1.3.1\n// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.\n// Underscore is freely distribu"
},
{
"path": "docs/_static/underscore.js",
"chars": 12140,
"preview": "// Underscore.js 1.3.1\n// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.\n// Underscore is freely distributable under "
},
{
"path": "docs/_static/websupport.js",
"chars": 25355,
"preview": "/*\n * websupport.js\n * ~~~~~~~~~~~~~\n *\n * sphinx.websupport utilities for all documentation.\n *\n * :copyright: Copyrigh"
},
{
"path": "docs/config.html",
"chars": 4132,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/constants.html",
"chars": 4153,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/drivers.html",
"chars": 5091,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/genindex.html",
"chars": 50162,
"preview": "\n\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html cla"
},
{
"path": "docs/index.html",
"chars": 4928,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/logging.html",
"chars": 68788,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/modules.html",
"chars": 9530,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/plugin_loader.html",
"chars": 4181,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/plugins.html",
"chars": 27930,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/py-modindex.html",
"chars": 12198,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/robot.drivers.html",
"chars": 5242,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/robot.html",
"chars": 108148,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/robot.sdk.html",
"chars": 35169,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/search.html",
"chars": 4275,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/searchindex.js",
"chars": 23543,
"preview": "Search.setIndex({docnames:[\"index\",\"modules\",\"plugins\",\"robot\",\"robot.drivers\",\"robot.sdk\",\"snowboy\",\"wukong\"],envversio"
},
{
"path": "docs/snowboy.html",
"chars": 26908,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/statistic.html",
"chars": 4153,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/utils.html",
"chars": 4125,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "docs/wukong.html",
"chars": 7880,
"preview": "\n\n<!DOCTYPE html>\n<!--[if IE 8]><html class=\"no-js lt-ie9\" lang=\"zh-CN\" > <![endif]-->\n<!--[if gt IE 8]><!--> <html clas"
},
{
"path": "plugins/Camera.py",
"chars": 3280,
"preview": "# -*- coding: utf-8 -*-\n\nimport os\nimport subprocess\nimport time\nfrom robot import config, constants, logging\nfrom robot"
},
{
"path": "plugins/CleanCache.py",
"chars": 530,
"preview": "# -*- coding: utf-8 -*-\n\nimport os\nfrom robot import constants, utils\nfrom robot.sdk.AbstractPlugin import AbstractPlugi"
},
{
"path": "plugins/Echo.py",
"chars": 427,
"preview": "# -*- coding: utf-8 -*-\n# author: wzpan\n# 回声\n\nimport logging\nfrom robot.sdk.AbstractPlugin import AbstractPlugin\n\nlogger"
},
{
"path": "plugins/Email.py",
"chars": 5661,
"preview": "# -*- coding: utf-8 -*-\nimport imaplib\nimport email\nimport time\nimport datetime\nfrom robot import logging\nfrom dateutil "
},
{
"path": "plugins/Geek.py",
"chars": 1767,
"preview": "# -*- coding: utf-8 -*-\nfrom robot import config, logging\nfrom robot.sdk.AbstractPlugin import AbstractPlugin\n\nlogger = "
},
{
"path": "plugins/Gossip.py",
"chars": 771,
"preview": "# -*- coding: utf-8 -*-\n# author: wzpan\n# 闲聊一下\n\nimport logging\nfrom robot.sdk.AbstractPlugin import AbstractPlugin\n\nlogg"
},
{
"path": "plugins/LocalPlayer.py",
"chars": 3684,
"preview": "# -*- coding: utf-8 -*-\nimport os\nimport platform\n\nfrom robot import config, logging\nfrom robot.Player import MusicPlaye"
},
{
"path": "plugins/Poem.py",
"chars": 623,
"preview": "# -*- coding: utf-8 -*-\n# author: wzpan\n# 写诗\n\nimport logging\nfrom robot.sdk.AbstractPlugin import AbstractPlugin\n\nINTENT"
},
{
"path": "plugins/Reminder.py",
"chars": 5584,
"preview": "# -*- coding: utf-8 -*-\n# author: wzpan\n# 闹钟\n\nimport logging\nimport os\nimport pickle\nimport time\n\nfrom robot import conf"
},
{
"path": "plugins/Volume.py",
"chars": 1477,
"preview": "# -*- coding: utf-8 -*-\nfrom robot.Player import MusicPlayer\nfrom robot import logging\nfrom robot.sdk.AbstractPlugin imp"
},
{
"path": "plugins/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "requirements.txt",
"chars": 313,
"preview": "pyyaml>=4.2b1\nrequests==2.31.0\nbaidu-aip==2.0.0.1\npydub==0.23.1\npython-dateutil==2.7.5\nwatchdog==0.9.0\npytz==2018.9\nfire"
},
{
"path": "robot/AI.py",
"chars": 19517,
"preview": "# -*- coding: utf-8 -*-\nimport os\nimport json\nimport random\nimport requests\n\nfrom uuid import getnode as get_mac\nfrom ab"
},
{
"path": "robot/ASR.py",
"chars": 9362,
"preview": "# -*- coding: utf-8 -*-\nimport json\nfrom aip import AipSpeech\nfrom .sdk import TencentSpeech, AliSpeech, XunfeiSpeech, B"
},
{
"path": "robot/BCI.py",
"chars": 1926,
"preview": "import importlib\nimport multiprocessing\nfrom robot import config, logging\nfrom datetime import datetime, timedelta\n\nlogg"
},
{
"path": "robot/Brain.py",
"chars": 3880,
"preview": "# -*- coding: utf-8 -*-\nimport re\nimport traceback\n\nfrom robot import config\nfrom robot import logging\nfrom . import plu"
},
{
"path": "robot/ConfigMonitor.py",
"chars": 743,
"preview": "# -*- coding: utf-8 -*-\n\nimport os\nfrom robot import config, utils, logging\nfrom watchdog.events import FileSystemEventH"
},
{
"path": "robot/Conversation.py",
"chars": 15020,
"preview": "# -*- coding: utf-8 -*-\nimport time\nimport uuid\nimport cProfile\nimport pstats\nimport io\nimport re\nimport os\nimport threa"
},
{
"path": "robot/LifeCycleHandler.py",
"chars": 6214,
"preview": "import logging\nimport multiprocessing\nimport os\nimport time\nimport pickle\nimport time\nimport _thread as thread\n\nfrom wat"
},
{
"path": "robot/NLU.py",
"chars": 5327,
"preview": "# -*- coding: utf-8 -*-\nfrom .sdk import unit\nfrom robot import logging\nfrom abc import ABCMeta, abstractmethod\n\nlogger "
},
{
"path": "robot/Player.py",
"chars": 8960,
"preview": "# -*- coding: utf-8 -*-\nimport asyncio\nimport subprocess\nimport os\nimport platform\nimport queue\nimport signal\nimport thr"
},
{
"path": "robot/Scheduler.py",
"chars": 4990,
"preview": "# wukong-robot 的提醒机制\n# 基于 BackgroundScheduler 做二次封装\nimport datetime\n\nfrom apscheduler.schedulers.background import Backg"
},
{
"path": "robot/TTS.py",
"chars": 15303,
"preview": "# -*- coding: utf -8-*-\nimport os\nimport base64\nimport tempfile\nimport pypinyin\nimport subprocess\nimport uuid\n\nimport as"
},
{
"path": "robot/Updater.py",
"chars": 3996,
"preview": "import os\nimport requests\nimport json\nimport semver\nfrom subprocess import call\nfrom robot import constants, logging\nfro"
},
{
"path": "robot/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "robot/config.py",
"chars": 4152,
"preview": "# -*- coding: utf-8 -*-\nimport yaml\nimport logging\nimport os\nfrom . import constants\n\nlogger = logging.getLogger(__name_"
},
{
"path": "robot/constants.py",
"chars": 1771,
"preview": "# -*- coding: utf-8 -*-\nimport os\nimport shutil\n\n# Wukong main directory\nAPP_PATH = os.path.normpath(\n os.path.join(o"
},
{
"path": "robot/detector.py",
"chars": 4283,
"preview": "import time\n\nfrom snowboy import snowboydecoder\nfrom robot import config, logging, utils, constants\n\nlogger = logging.ge"
},
{
"path": "robot/drivers/AIY.py",
"chars": 1088,
"preview": "import time\n\n\nclass AIY:\n def __init__(self):\n self._wakeup = False\n self._think = False\n\n def wakeu"
},
{
"path": "robot/drivers/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "robot/drivers/apa102.py",
"chars": 9717,
"preview": "\"\"\"\nfrom https://github.com/tinue/APA102_Pi\nThis is the main driver module for APA102 LEDs\n\"\"\"\nimport spidev\nfrom math i"
},
{
"path": "robot/drivers/pixels.py",
"chars": 3231,
"preview": "from . import apa102\nimport time\nimport threading\n\ntry:\n import queue as Queue\nexcept ImportError:\n import Queue a"
},
{
"path": "robot/logging.py",
"chars": 1954,
"preview": "import logging\nimport os\n\nfrom robot import constants\nfrom logging.handlers import RotatingFileHandler\n\nPAGE = 4096\n\nDEB"
},
{
"path": "robot/plugin_loader.py",
"chars": 1935,
"preview": "# -*- coding: utf-8 -*-\nimport pkgutil\nfrom . import config\nfrom . import constants\nfrom robot import logging\nfrom robot"
},
{
"path": "robot/sdk/AbstractPlugin.py",
"chars": 2770,
"preview": "import sys\nfrom robot import logging\nfrom robot import constants\nfrom abc import ABCMeta, abstractmethod\n\nlogger = loggi"
},
{
"path": "robot/sdk/AliSpeech.py",
"chars": 5058,
"preview": "# -*- coding: UTF-8 -*-\n\nimport http.client\nimport urllib.parse\nimport json\nfrom robot import utils\nfrom robot import lo"
},
{
"path": "robot/sdk/BaiduSpeech.py",
"chars": 3264,
"preview": "# -*- coding:utf-8 -*-\nimport os\nimport json\nimport requests\nimport time\nfrom robot import logging\n\nlogger = logging.get"
},
{
"path": "robot/sdk/FunASREngine.py",
"chars": 758,
"preview": "\nfrom typing import Any\n\n\nclass funASREngine(object):\n def __init__(self, inference_type, model_dir=''):\n asse"
},
{
"path": "robot/sdk/History.py",
"chars": 1097,
"preview": "# -*- coding: utf-8 -*-\n# 用于维护历史消息\nimport tornado.locks\n\n\ndef Singleton(cls):\n _instance = {}\n\n def _singleton(*ar"
},
{
"path": "robot/sdk/LED.py",
"chars": 1209,
"preview": "import _thread as thread\nfrom robot import config, logging\nfrom robot.drivers.AIY import AIY\n\nlogger = logging.getLogger"
},
{
"path": "robot/sdk/RASRsdk.py",
"chars": 4790,
"preview": "# -*- coding:utf-8 -*-\r\nimport urllib.request\r\nimport hmac\r\nimport hashlib\r\nimport base64\r\nimport time\r\nimport random\r\ni"
},
{
"path": "robot/sdk/TencentSpeech.py",
"chars": 8003,
"preview": "# coding: utf-8\n#!/usr/bin/env python3\n\n\n\"Tencent ASR && TTS API\"\n__author__ = \"Charles Li, Joseph Pan\"\n\nimport time\nimp"
},
{
"path": "robot/sdk/Unihiker.py",
"chars": 1227,
"preview": "from robot import constants, config\nfrom unihiker import Audio, GUI\nfrom pinpong.board import Board, Pin, Tone\nfrom pinp"
},
{
"path": "robot/sdk/VITSClient.py",
"chars": 572,
"preview": "# coding: utf-8\n# !/usr/bin/env python3\n\n\"\"\"VITS TTS API\"\"\"\n\nimport requests\n\n\ndef tts(text, server_url, api_key, speake"
},
{
"path": "robot/sdk/VolcengineSpeech.py",
"chars": 13527,
"preview": "#coding=utf-8\n\n\"\"\"\nrequires Python 3.6 or later\n\npip install asyncio\npip install websockets\n\"\"\"\n\nimport asyncio\nimport b"
},
{
"path": "robot/sdk/XunfeiSpeech.py",
"chars": 10544,
"preview": "import websocket\nimport hashlib\nimport base64\nimport hmac\nimport json\nimport wave\nimport tempfile\nfrom urllib.parse impo"
},
{
"path": "robot/sdk/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "robot/sdk/atc.py",
"chars": 4355,
"preview": "# # -*- coding=utf-8 -*-\n# digit=['零','一','二','三','四','五','六','七','八','九']\n# unit=['零','十','百','千','万','亿']\n# def arabic"
},
{
"path": "robot/sdk/unit.py",
"chars": 6452,
"preview": "# encoding:utf-8\nimport os\nimport uuid\nimport json\nimport requests\nimport datetime\nfrom uuid import getnode as get_mac\nf"
},
{
"path": "robot/statistic.py",
"chars": 966,
"preview": "# -*- coding: utf -8-*-\n\nfrom . import config\nimport uuid\nimport requests\nimport threading\n\n\ndef getUUID():\n mac = uu"
},
{
"path": "robot/utils.py",
"chars": 7958,
"preview": "# -*- coding: utf-8 -*-\n\nimport os\nimport tempfile\nimport wave\nimport shutil\nimport re\nimport time\nimport json\nimport ya"
},
{
"path": "server/server.py",
"chars": 15898,
"preview": "import os\nimport yaml\nimport json\nimport time\nimport base64\nimport random\nimport hashlib\nimport asyncio\nimport requests\n"
},
{
"path": "server/static/api.css",
"chars": 738,
"preview": "table {\n margin-top:15px;\n border-collapse:collapse;\n border:1px solid #aaa;\n width:100%;\n margin-bottom:"
},
{
"path": "server/static/bootbox.js",
"chars": 26414,
"preview": "/**\n * bootbox.js [v4.4.0]\n *\n * http://bootboxjs.com/license.txt\n */\n\n// @see https://github.com/makeusabrew/bootbox/is"
},
{
"path": "server/static/bubble.css",
"chars": 12646,
"preview": "/* ------------------------------------------\n PURE CSS SPEECH BUBBLES\n by Nicolas Gallagher\n - http://nicolasgall"
},
{
"path": "server/static/config.js",
"chars": 3288,
"preview": "function saveConfig(msg) {\n if (window.location.href.indexOf('bot.hahack.com') >= 0) {\n bootbox.alert(\"demo 站点"
},
{
"path": "server/static/index.js",
"chars": 7319,
"preview": "var md = window.markdownit({\n html: true,\n linkify: true,\n typographer: true,\n highlight: function (str, lan"
},
{
"path": "server/static/jquery.fancybox.css",
"chars": 17670,
"preview": "body.compensate-for-scrollbar {\n overflow: hidden; }\n\n.fancybox-active {\n height: auto; }\n\n.fancybox-is-hidden {\n lef"
},
{
"path": "server/static/jquery.fancybox.js",
"chars": 145810,
"preview": "// ==================================================\n// fancyBox v3.3.5\n//\n// Licensed GPLv3 for open source use\n// or "
},
{
"path": "server/static/log.js",
"chars": 822,
"preview": "function refresh(msg) {\n $.ajax({\n url: '/getlog',\n type: \"GET\",\n data: $.param({'validate': get"
},
{
"path": "server/static/main.js",
"chars": 10744,
"preview": "var menu = document.getElementById('menu');\n\nfunction restart() {\n $.ajax({\n url: '/operate',\n type: \"P"
},
{
"path": "server/static/modernizr.touch.js",
"chars": 2290,
"preview": "/* Modernizr 2.8.3 (Custom Build) | MIT & BSD\n * Build: http://modernizr.com/download/#-touch-teststyles-prefixes\n */\n;w"
},
{
"path": "server/static/monokai-sublime.css",
"chars": 1036,
"preview": "/*\n *\n * Monokai Sublime style. Derived from Monokai by noformnocontent http://nn.mit-license.org/\n *\n * */\n\n.hljs {\n d"
},
{
"path": "server/static/qa.js",
"chars": 1161,
"preview": "function upload() {\n $.ajax({\n url: '/qa',\n type: \"POST\",\n data: {\"qa\": $('#qa-input').val(), 'v"
},
{
"path": "server/static/signin.css",
"chars": 879,
"preview": "html,\nbody {\n height: 100%;\n}\n\nbody {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n al"
},
{
"path": "server/static/spin.css",
"chars": 378,
"preview": "@keyframes spinner-line-fade-more {\n 0%, 100% {\n opacity: 0; /* minimum opacity */\n }\n 1% {\n opacity: 1;\n }\n}\n"
},
{
"path": "server/static/starter-template.css",
"chars": 1239,
"preview": "body {\n padding-top: 3rem;\n}\n\n.starter-template {\n padding-top: 3rem; \n}\n\n.update-alert {\n margin-left: 0;\n "
},
{
"path": "server/static/static.js",
"chars": 0,
"preview": ""
},
{
"path": "server/templates/api.html",
"chars": 2563,
"preview": "{% extends \"layout.html\" %}\n{% block body %}\n<link rel=\"stylesheet\" href=\"{{static_url('starter-template.css')}}\" crosso"
},
{
"path": "server/templates/api.md",
"chars": 4728,
"preview": "# 后台 API\n\n[TOC]\n\n## 鉴权\n\n所有接口都需要带上 `validate` 参数,该参数值和配置文件中的 `server/validate` 参数值相同。示例:\n\n``` sh\n$ curl localhost:5001/hi"
},
{
"path": "server/templates/config.html",
"chars": 3758,
"preview": "{% extends \"layout.html\" %}\n{% block body %}\n<link rel=\"stylesheet\" href=\"{{static_url('starter-template.css')}}\" crosso"
},
{
"path": "server/templates/donate.html",
"chars": 2563,
"preview": "{% extends \"layout.html\" %}\n{% block body %}\n<link rel=\"stylesheet\" href=\"{{static_url('starter-template.css')}}\" crosso"
},
{
"path": "server/templates/index.html",
"chars": 8083,
"preview": "{% extends \"layout.html\" %}\n{% autoescape None %}\n{% block body %}\n<link rel=\"stylesheet\" href=\"{{static_url('starter-te"
},
{
"path": "server/templates/layout.html",
"chars": 2265,
"preview": "<!doctype html>\n<html lang=\"en\" class=\"h-100\">\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"wi"
},
{
"path": "server/templates/log.html",
"chars": 3107,
"preview": "{% extends \"layout.html\" %}\n{% block body %}\n<link rel=\"stylesheet\" href=\"{{static_url('starter-template.css')}}\" crosso"
},
{
"path": "server/templates/login.html",
"chars": 839,
"preview": "{% extends \"layout.html\" %}\n{% block body %}\n<link href=\"{{static_url('signin.css')}}\" rel=\"stylesheet\">\n <div class=\"c"
},
{
"path": "server/templates/qa.html",
"chars": 4316,
"preview": "{% extends \"layout.html\" %}\n{% block body %}\n<link rel=\"stylesheet\" href=\"{{static_url('starter-template.css')}}\" crosso"
},
{
"path": "snowboy/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "snowboy/snowboydecoder.py",
"chars": 15307,
"preview": "#!/usr/bin/env python\n\nimport collections\nimport pyaudio\nfrom . import snowboydetect\nfrom robot import utils, logging\nim"
},
{
"path": "snowboy/snowboydetect.py",
"chars": 6435,
"preview": "# This file was automatically generated by SWIG (http://www.swig.org).\n# Version 3.0.12\n#\n# Do not make changes to this "
},
{
"path": "static/default.yml",
"chars": 9849,
"preview": "robot_name_cn: '孙悟空'\nfirst_name: '师父'\nlast_name: '唐'\ntimezone: HKT\nlocation: '深圳'\n\n# 后台管理端\nserver:\n enable: true\n "
},
{
"path": "static/qa.csv",
"chars": 9239,
"preview": "question\tanswer\n你是谁\t[\"我是孙悟空!\", \"我是花果山水帘洞美猴王齐天大圣孙悟空!\"]\n你叫什么名字\t[\"我是孙悟空!\", \"我是花果山水帘洞美猴王齐天大圣孙悟空!\"]\n你喜欢做什么?\t我喜欢听音乐,你呢?\n讲个笑话\t["
},
{
"path": "tools/changelog.sh",
"chars": 52,
"preview": "conventional-changelog -p angular -i CHANGELOG.md -w"
},
{
"path": "tools/make_json.py",
"chars": 2698,
"preview": "# coding=utf-8\n\n# Copyright (c) 2018 Baidu, Inc. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0"
}
]
// ... and 9 more files (download for full content)
About this extraction
This page contains the full source code of the wzpan/wukong-robot GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 209 files (2.6 MB), approximately 698.7k tokens, and a symbol index with 873 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.