diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 0000000..1b907d3
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1 @@
+github: kennethreitz
diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml
new file mode 100644
index 0000000..8bc4dc8
--- /dev/null
+++ b/.github/workflows/pages.yml
@@ -0,0 +1,58 @@
+name: Deploy documentation
+
+on:
+ push:
+ branches:
+ - master
+ workflow_dispatch:
+
+permissions:
+ contents: read
+ pages: write
+ id-token: write
+
+concurrency:
+ group: pages
+ cancel-in-progress: false
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Set up uv
+ uses: astral-sh/setup-uv@v8.1.0
+
+ - name: Set up Python
+ uses: actions/setup-python@v5
+ with:
+ python-version: "3.12"
+
+ - name: Configure Pages
+ uses: actions/configure-pages@v5
+
+ - name: Install dependencies
+ run: uv sync --python 3.12 --frozen --no-install-project
+
+ - name: Build documentation
+ run: make html
+
+ - name: Upload Pages artifact
+ uses: actions/upload-pages-artifact@v3
+ with:
+ path: docs/_build/html
+
+ deploy:
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ runs-on: ubuntu-latest
+ needs: build
+
+ steps:
+ - name: Deploy to GitHub Pages
+ id: deployment
+ uses: actions/deploy-pages@v4
diff --git a/.gitignore b/.gitignore
index abe9e6c..a0afb4c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,3 +10,13 @@ docs/_build
# 忽略build产生的文件
build/
+
+# mac
+.DS_Store
+
+# editor
+.vscode
+
+# virutal env
+venv/
+.venv/
diff --git a/.travis.yml b/.travis.yml
index b107f12..77a0fdd 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,5 +1,7 @@
sudo: false
language: python
+python:
+ - "3.6"
install: pip install sphinx
script:
- make doctest
diff --git a/Contributing.md b/Contributing.md
index edb9ae5..30ae478 100644
--- a/Contributing.md
+++ b/Contributing.md
@@ -3,7 +3,7 @@
此份指南处于大量的发展阶段,如果您愿意贡献一份力量,请见此:
-http://docs.python-guide.org/en/latest/notes/contribute/
+https://docs.python-guide.org/en/latest/notes/contribute/
如何测试您的修改
------------------------
@@ -16,15 +16,15 @@ pip install --user sphinx
```
然后导航到makefile的目录,并执行 ```make build``` 或 ```make html``` 。然后,
-Sphinx将在名为_build/html的文件夹中生成html。
+Sphinx将在名为 `_build/html` 的文件夹中生成html。
-导航到此文件夹后,您可以使用python的内置Web服务器在本地查看更改:
+导航到此文件夹后,您可以使用Python的内置Web服务器在本地查看更改:
``` bash
python3 -m http.server
```
-默认情况下,http.server监听每个绑定在您的主机IP地址的8000端口。要绑定到特定IP和端口,例如,localhost的8005端口:
+默认情况下,`http.server` 监听每个绑定在您的主机IP地址的8000端口。要绑定到特定IP和端口,例如,localhost的8005端口:
``` bash
python3 -m http.server 8005 --bind 127.0.0.1
@@ -36,4 +36,4 @@ python3 -m http.server 8005 --bind 127.0.0.1
所有的贡献请遵循 `指南风格指引`:
-http://docs.python-guide.org/en/latest/notes/styleguide/
+https://docs.python-guide.org/notes/styleguide/
diff --git a/Makefile b/Makefile
index e702e78..bfbcd42 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,47 @@
-.PHONY: build
+.DEFAULT_GOAL := help
+
+UV ?= uv
+PYTHON_VERSION ?= 3.12
+VENV ?= .venv
+PORT ?= 8005
+
+VENV_BIN := $(VENV)/bin
+VENV_PYTHON := $(CURDIR)/$(VENV_BIN)/python
+SPHINXBUILD := $(CURDIR)/$(VENV_BIN)/sphinx-build
+BUILD_DIR := docs/_build
+INSTALL_STAMP := $(VENV)/.installed
+DOC_TARGETS := dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf latexpdfja text man texinfo info gettext changes linkcheck doctest xml pseudoxml netlify
+
+.PHONY: help install build html serve clean $(DOC_TARGETS)
+
+help:
+ @echo "Please use \`make ' where is one of"
+ @echo " install create $(VENV) with uv and install dependencies"
+ @echo " html build standalone HTML files"
+ @echo " serve build and serve docs at http://localhost:$(PORT)/"
+ @echo " clean remove generated documentation files"
+ @echo
+ @echo "Other Sphinx targets are forwarded to docs/Makefile."
+
+install: $(INSTALL_STAMP)
+
+$(INSTALL_STAMP): pyproject.toml uv.lock Makefile
+ @command -v $(UV) >/dev/null 2>&1 || (echo "uv is required. Install it from https://docs.astral.sh/uv/" && exit 1)
+ $(UV) sync --python $(PYTHON_VERSION) --frozen --no-install-project
+ @touch $(INSTALL_STAMP)
+
build: html
-# this pattern rule lets you run "make build" (or any other target
-# in docs/Makefile) in this directory as though you were in docs/
-%:
- cd docs && make $@
+html: install
+ $(MAKE) -C docs html SPHINXBUILD=$(SPHINXBUILD)
+ @touch $(BUILD_DIR)/html/.nojekyll
+
+serve: html
+ cd $(BUILD_DIR)/html && $(VENV_PYTHON) -m http.server $(PORT)
+
+clean:
+ rm -rf $(BUILD_DIR)/*
+
+# These targets let you run common docs/Makefile targets from the repository root.
+$(DOC_TARGETS): install
+ $(MAKE) -C docs $@ SPHINXBUILD=$(SPHINXBUILD)
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..4534b04
--- /dev/null
+++ b/README.md
@@ -0,0 +1,62 @@
+# Python最佳实践指南中文版
+
+[](#支持者)
+[](#赞助者)
+
+
+
+项目翻译来自 [Hitchhiker's Guide to Python](https://github.com/kennethreitz/python-guide)。
+
+文档地址:[Python最佳实践指南中文版](https://prodesire.github.io/Python-Guide-CN/)
+
+本指南目前持续不断地更新与完善。这份主要是自我见解的指南旨在为 Python 初学者和专家提供一个关于 Python 安装、配置和日常使用的最佳实践手册。
+
+主题包括:
+
+- 不同平台和系统上的安装
+- Py2app、Py2exe、bbfreeze、pyInstaller
+- Pip
+- NumPy、SciPy、statpy、pyplot、matplotlib
+- Virtualenv
+- Fabric
+- 优秀的模块推荐,按主题/目的分类
+- 在哪些场景下使用哪些模块
+- 服务器配置与不同的 Web 框架和工具
+- 文档:写文档
+- 测试:Jenkins 与 tox 指南
+- 如何更方便地通过 `git` 连接 `hg`
+
+## 使用指南
+
+1. 下载 zip 文件或 clone 到本地,并进入到项目根目录。
+2. 运行 `make help` 查看可用命令。
+3. 运行 `make install` 使用 uv 根据 `pyproject.toml` 创建虚拟环境并安装依赖。
+4. 运行 `make html` 构建文档;或运行 `make serve` 构建并启动本地文档网站。
+5. `make html` 会在 `docs/_build/html` 中生成 HTML 文件,`make serve` 默认会在 `http://localhost:8005/` 运行文档网站。
+
+## 翻译指南
+
+1. 将 [python-guide](https://github.com/kennethreitz/python-guide) 项目和本项目的 `master` 分支更新。
+2. 查看本项目 `diff.txt` 中的当前翻译版本对应的原版提交号,在 `python-guide` 中比对 `master` 分支上最新提交和该提交号的差异,并据此翻译进本项目。
+3. 翻译完毕后将 `python-guide` 中 `master` 分支上的最新提交号更新入 `diff.txt` 的当前翻译版本对应的原版提交号。
+4. 在本项目中提交修改、推送,并发起合并请求。
+
+## 鸣谢
+
+### 贡献者
+
+感谢所有为本项目做出贡献的人。
+
+
+
+### 支持者
+
+感谢所有支持者。[成为支持者](https://opencollective.com/python-guide-cn#backer)。
+
+[](https://opencollective.com/python-guide-cn#backers)
+
+### 赞助者
+
+欢迎赞助本项目。您的 Logo 将显示在这里,并链接到您的网站。[成为赞助者](https://opencollective.com/python-guide-cn#sponsor)。
+
+[](https://opencollective.com/python-guide-cn/sponsor/0/website)
diff --git a/Readme.rst b/Readme.rst
deleted file mode 100644
index 501c846..0000000
--- a/Readme.rst
+++ /dev/null
@@ -1,108 +0,0 @@
-Python最佳实践指南中文版
-============================
-
-.. image:: https://farm1.staticflickr.com/628/33173824932_58add34581_k_d.jpg
-
-项目翻译自 `Hitchhiker's Guide to Python `_。
-
-Readthedocs文档地址 `Python最佳实践指南中文版 `_。
-
------------
-
-本指南目前持续不断地更新与完善。这份主要是自我见解的指南旨在为Python初学者和
-专家提供一个关于Python安装、配置、和日常使用的最佳实践手册。
-
-
-主题包括:
-
-- 不同平台和系统上的安装
-- Py2app, Py2exe, bbfreeze, pyInstaller
-- Pip
-- Numpy, scipy, statpy, pyplot, matplotlib
-- Virtualenv
-- Fabric
-- 优秀的模块推荐,按主题/目的分类
-- 在哪些场景下使用哪些模块
-- 服务器配置 & 不同的web框架和工具
-- 文档: 写文档
-- 测试: Jenkins & tox 指南
-- 如何更方便地通过 ``git`` 连接 ``hg``
-
-如果您不习惯阅读reStructuredText形式的文档, 这里有一份同步更新的 `HTML版文档,请戳它 `_。
-
-使用指南
-============================
-1. 下载zip文件或clone到本地,并进入到项目根目录
-2. 打开命令行,运行 `pip install -r requirements.txt` 安装依赖
-3. 打开命令行,运行 `make html` ; 或者(针对Windows)运行makehtml.bat
-4. 上述步骤自动在根目录下生成build文件夹,打开./build/html/index.html即可浏览文档
-
-或者
----------------------------
-- 直接访问 `Python最佳实践指南中文版 `_。
-
------------
-
-翻译进度(完成)
-============================
-Getting Started(开始吧)(完成)
----------------------------
-- Picking an Interpreter(选择一个解释器)(完成)
-- Properly Install Python(正确地安装Python)(完成)
-
-Writing Great Code(写出优雅的代码)(完成)
----------------------------
-- Structuring Your Project(结构化您的工程)(完成)
-- Code Style(代码风格)(完成)
-- Reading Great Code(阅读好的代码)(完成)
-- Documentation(文档)(完成)
-- Testing Your Code(测试您的代码)(完成)
-- Logging(日志)(完成)
-- Common Gotchas(常见陷阱)(完成)
-- Choosing a License(选择一个许可)(完成)
-
-Scenario Guide(场景/方案指南)(完成)
----------------------------
-- Network Applications(网络应用)(完成)
-- Web Applications(Web 应用)(完成)
-- HTML Scraping(HTML 抓取)(完成)
-- Command-line Applications(命令行应用)(完成)
-- GUI Applications(GUI应用)(完成)
-- Databases(数据库)(完成)
-- Networking(网络)(完成)
-- Systems Administration(系统管理)(完成)
-- Continuous Integration(持续集成)(完成)
-- Speed(速度)(完成)
-- Scientific Applications(科学应用)(完成)
-- Image Manipulation(图像处理)(完成)
-- XML parsing(XML解析)(完成)
-- JSON(JSON)(完成)
-- Cryptography(密码学)(完成)
-- Interfacing with C/C++ Libraries(与C/C++库交互)(完成)
-- Machine Learning(机器学习)(完成)
-- Data Serialization(数据序列化)(完成)
-
-Shipping Great Code(部署优雅的代码)(完成)
----------------------------
-- Packaging Your Code(打包您的代码)(完成)
-- Freezing Your Code(冻结您的代码)(完成)
-
-Development Environment(开发环境)(完成)
----------------------------
-- Your Development Environment(您的开发环境)(完成)
-- Virtual Environments(虚拟环境)(完成)
-- Further Configuration of Pip and Virtualenv(Pip和Virtualenv的更多配置)(完成)
-
-Additional Notes(额外关注)(完成)
----------------------------
-- Introduction(介绍)(完成)
-- The Community(社区)(完成)
-- Learning Python(学习Python)(完成)
-- Documentation(文档)(完成)
-- News(新闻)(完成)
-
-其他(完成)
----------------------------
-- Contribute(贡献)(完成)
-- License(许可证)(完成)
-- The Guide Style Guide(风格指南指引)(完成)
diff --git a/TODO.rst b/TODO.rst
deleted file mode 100644
index af9093b..0000000
--- a/TODO.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-* Establish "use this" vs "alternatives are...." recommendations
-
-.. todolist::
\ No newline at end of file
diff --git a/diff.txt b/diff.txt
index bfa0ef1..dbac9df 100644
--- a/diff.txt
+++ b/diff.txt
@@ -1,2 +1,2 @@
-当前翻译版本对应的原版提交为: 411599c5ad72dcffbe5f4d5160ff5110e1b802a6
-当前要翻译版本对应的原版提交为: 暂无
\ No newline at end of file
+当前翻译版本对应的原版提交为: 9715682d556b13e5a182aaac2a0428da7b31003e
+当前要翻译版本对应的原版提交为: 无
diff --git a/docs/404.rst b/docs/404.rst
new file mode 100644
index 0000000..7252597
--- /dev/null
+++ b/docs/404.rst
@@ -0,0 +1,28 @@
+:orphan:
+
+###############
+404 — Not Found
+###############
+
+**抱歉,我们无法找到您请求的页面.**
+
+看起来有如下原因:
+
+- 使用了错误的地址
+- 使用了过期的链接
+
+`点此返回主页 `_
+
+或者尝试 `搜索 `_.
+
+.. raw:: html
+
+
diff --git a/docs/Makefile b/docs/Makefile
index 40b479e..963704a 100644
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -19,7 +19,7 @@ ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
-.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
+.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf latexpdfja text man changes linkcheck doctest gettext
help:
@echo "Please use \`make ' where is one of"
@@ -59,6 +59,12 @@ dirhtml:
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
+netlify: dirhtml
+ @cp $(BUILDDIR)/dirhtml/404/index.html $(BUILDDIR)/dirhtml/404.html
+ @sed -i -e 's/src="..\//src="\//g' $(BUILDDIR)/dirhtml/404.html
+ @sed -i -e 's/href="..\//href="\//g' $(BUILDDIR)/dirhtml/404.html
+ @cp _extra/* $(BUILDDIR)/dirhtml/
+
singlehtml:
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
@echo
@@ -175,3 +181,6 @@ pseudoxml:
$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
@echo
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
+
+serve:
+ cd $(BUILDDIR)/dirhtml && python3 -m http.server 8005
diff --git a/docs/_extra/_redirects b/docs/_extra/_redirects
new file mode 100644
index 0000000..2cb9863
--- /dev/null
+++ b/docs/_extra/_redirects
@@ -0,0 +1,18 @@
+# Redirect rules
+# Docs: https://www.netlify.com/docs/redirects/
+
+# Redirect http to https (avoid one extra hop with an explicit rule for /en/latest/)
+http://docs.python-guide.org/en/latest/* https://docs.python-guide.org/:splat 301!
+http://docs.python-guide.org/* https://docs.python-guide.org/:splat 301!
+
+# Redirect RTD prefix to /
+/en/latest/* /:splat 301!
+
+# Redirect domain aliases to primary domain
+http://python-guide.org/* http://docs.python-guide.org/:splat 301!
+https://python-guide.org/* https://docs.python-guide.org/:splat 301!
+
+# Redirect Netlify version to primary domain
+https://python-guide.netlify.com/* https://docs.python-guide.org/:splat 301!
+
+/guide-book https://www.amazon.com/Hitchhikers-Guide-Python-Practices-Development/dp/1491933178/ref=as_li_ss_il?ie=UTF8&linkCode=li2&tag=bookforkind-20&linkId=804806ebdacaf3b56567347f3afbdbca 302
diff --git a/docs/_extra/ads.txt b/docs/_extra/ads.txt
new file mode 100644
index 0000000..52291a9
--- /dev/null
+++ b/docs/_extra/ads.txt
@@ -0,0 +1,340 @@
+33across.com, 0010b00002Mpn7AAAR, DIRECT, bbea06d9c4d2853c
+33across.com, 0013300001kQj2HAAS, RESELLER, bbea06d9c4d2853c
+33across.com, 0013300001qkdlwAAA, RESELLER
+33across.com, 0013300001r0t9mAAA, RESELLER
+33across.com, 0014000001aXjnGAAS, RESELLER, bbea06d9c4d2853c # 33 Across
+33across.com,0013300001r0t9mAAA,reseller,bbea06d9c4d2853c
+ad-generation.jp,12474,RESELLER,7f4ea9029ac04e53
+adform.com, 183, RESELLER
+adform.com, 2708, DIRECT, 9f5210a2f0999e32
+adtech.com, 10947, DIRECT, e1a5b5b6e3255540
+adtech.com, 11095, RESELLER
+adtech.com, 11119, RESELLER
+adtech.com, 11208, RESELLER
+adtech.com, 11341, DIRECT
+adtech.com, 12094, RESELLER
+adtech.com, 12094, RESELLER # 33 Across
+adtech.com, 9904, RESELLER
+adtech.com,12068,RESELLER,e1a5b5b6e3255540
+advangelists.com, 8d3bba7425e7c98c50f52ca1b52d3735, RESELLER, 60d26397ec060f98
+advangelists.com, 8d3bba7425e7c98c50f52ca1b52d3735, RESELLER, 60d26397ec060f98 # 33 Across
+advertising.com, 11602, RESELLER
+Advertising.com, 16736, RESELLER
+advertising.com, 19623, RESELLER # AOL - One
+advertising.com, 24410, RESELLER
+advertising.com, 28409, DIRECT, e1a5b5b6e3255540
+advertising.com, 28509, DIRECT, e1a5b5b6e3255540
+advertising.com, 28605, RESELLER # RhythmOne
+advertising.com, 7372, RESELLER
+advertising.com, 8603, RESELLER # Taboola
+amxrtb.com, 105199384, DIRECT
+aol.com, 11119, DIRECT
+aol.com, 53392, RESELLER # Taboola
+aolcloud.net, 9904, RESELLER
+appnexus.com, 1001, RESELLER, f5ab79cb980f11d1
+appnexus.com, 10239, RESELLER, f5ab79cb980f11d1
+appnexus.com, 10239, RESELLER, f5ab79cb980f11d1 # 33 Across
+appnexus.com, 11786, RESELLER, f5ab79cb980f11d1
+appnexus.com, 11801, RESELLER
+appnexus.com, 11924, RESELLER, f5ab79cb980f11d1
+appnexus.com, 12061, RESELLER
+appnexus.com, 12263, RESELLER
+appnexus.com, 12290, RESELLER, f5ab79cb980f11d1
+appnexus.com, 12366, RESELLER, f5ab79cb980f11d1
+appnexus.com, 1314, RESELLER
+Appnexus.com, 1356, RESELLER, f5ab79cb980f11d1
+appnexus.com, 1360, RESELLER, f5ab79cb980f11d1
+appnexus.com, 1613, reseller
+appnexus.com, 1908, RESELLER
+appnexus.com, 1908, RESELLER, f5ab79cb980f11d1
+appnexus.com, 1908, RESELLER, f5ab79cb980f11d1 # DistrictM
+appnexus.com, 1942, RESELLER, f5ab79cb980f11d1
+appnexus.com, 2530, RESELLER
+appnexus.com, 2758, RESELLER, f5ab79cb980f11d1
+appnexus.com, 3135, RESELLER, f5ab79cb980f11d1
+appnexus.com, 3153, DIRECT
+appnexus.com, 3153, RESELLER
+appnexus.com, 3153, RESELLER, f5ab79cb980f11d1
+appnexus.com, 3326, reseller
+appnexus.com, 4052, RESELLER
+appnexus.com, 4052, RESELLER, f5ab79cb980f11d1 # Conversant
+appnexus.com, 6849, RESELLER, f5ab79cb980f11d1 # RhythmOne
+appnexus.com, 7118, RESELLER
+appnexus.com, 7556, DIRECT, f5ab79cb980f11d1
+appnexus.com, 7597, RESELLER, f5ab79cb980f11d1
+appnexus.com, 7911, RESELLER #yieldmo
+appnexus.com, 7944, RESELLER
+appnexus.com, 8692, DIRECT, f5ab79cb980f11d1
+appnexus.com, 9316, RESELLER, f5ab79cb980f11d1 # AppNexus
+appnexus.com, 9393, DIRECT
+appnexus.com, 9393, RESELLER #Video #Display, f5ab79cb980f11d1
+appnexus.com,1001,reseller,f5ab79cb980f11d1
+appnexus.com,10239,reseller,f5ab79cb980f11d1
+appnexus.com,1356,reseller,f5ab79cb980f11d1
+appnexus.com,1908,RESELLER,f5ab79cb980f11d1
+appnexus.com,2758,reseller,f5ab79cb980f11d1
+appnexus.com,3663,RESELLER,f5ab79cb980f11d1
+appnexus.com,7597,reseller,f5ab79cb980f11d1
+appnexus.com,9316,reseller,f5ab79cb980f11d1
+aps.amazon.com,094e2c86-72d9-47d6-a647-d95ce39ad4c7,DIRECT
+aps.amazon.com,2840f06c-5d89-4853-a03e-3bfa567dd33c,reseller
+aps.amazon.com,48266a61-b3d9-4cb7-b172-553abc6a42a4,DIRECT
+aralego.com, par-488A3E6BD8D997D0ED8B3BD34D8BA4B, RESELLER # ucFunnel
+audienciad.com, 202922, DIRECT
+bidtellect.com, 1407, RESELLER, 1c34aa2d85d45e93
+bidtellect.com,1407,reseller,1c34aa2d85d45e93
+brightcom.com, 20292, DIRECT
+ccoxmt.com, 2000067997702, RESELLER
+consumable.com, 2000908, DIRECT, aefcd3d2f45b5070
+contextweb.com, 558355, RESELLER
+contextweb.com, 558511, RESELLER
+contextweb.com, 560606, RESELLER
+contextweb.com, 560606, RESELLER, 89ff185a4c4e857
+contextweb.com, 560606, RESELLER, 89ff185a4c4e857c
+contextweb.com, 561118, RESELLER, 89ff185a4c4e857c #yieldmo
+contextweb.com, 561998, RESELLER, 89ff185a4c4e857c
+contextweb.com, 562350, RESELLER, 89ff185a4c4e857c
+contextweb.com,558355,reseller
+conversantmedia.com, 20923, RESELLER # Conversant
+conversantmedia.com, 39882, DIRECT, 03113cd04947736d
+conversantmedia.com, 40790, RESELLER, 03113cd04947736d
+conversantmedia.com, 41812, DIRECT
+coxmt.com, 2000067907202, RESELLER
+criteo.com, 109412, DIRECT, 9fac4a4a87c2a44f
+districtm.io, 100808, DIRECT
+districtm.io, 100835, DIRECT
+districtm.io, 100835, DIRECT, 3fd707be9c4527c3
+districtm.io, 101080, RESELLER
+districtm.io, 101769, RESELLER, 3fd707be9c4527c3 # DistrictM
+districtm.io,100962,RESELLER,3fd707be9c4527c3
+EMXDGT.com, 1133, DIRECT, 1e1d41537f7cad7f
+emxdgt.com, 20, DIRECT, 1e1d41537f7cad7f
+emxdgt.com, 326, RESELLER, 1e1d41537f7cad7f
+emxdgt.com, 326, RESELLER, 1e1d41537f7cad7f # 33 Across
+EMXDGT.com,1284,reseller,1e1d41537f7cad7f
+engagebdr.com, 10417, RESELLER # EngageDBR
+freewheel.tv, 146081, reseller
+freewheel.tv, 19129, RESELLER
+freewheel.tv, 19133, RESELLER
+freewheel.tv, 33081, RESELLER
+freewheel.tv, 33601, RESELLER
+freewheel.tv, 799841, RESELLER # Taboola
+freewheel.tv, 799921, RESELLER # Taboola
+google.com, pub-1320774679920841, RESELLER, f08c47fec0942fa0
+google.com, pub-1409765517756851, reseller
+google.com, pub-2290755540215120, RESELLER, f08c47fec0942fa0
+google.com, pub-2802445174821308, RESELLER, f08c47fec0942fa0
+google.com, pub-3848273848634341, RESELLER, f08c47fec0942fa0
+google.com, pub-4075894099602271, reseller
+google.com, pub-4207323757133151, RESELLER, f08c47fec0942fa0
+google.com, pub-4641608711979091, DIRECT, f08c47fec0942fa0
+google.com, pub-5231479214411897, RESELLER, f08c47fec0942fa0
+Google.com, pub-5995202563537249, RESELLER, f08c47fec0942fa0
+google.com, pub-6314168058065736, RESELLER, f08c47fec0942fa0
+google.com, pub-8172268348509349, RESELLER, f08c47fec0942fa0
+google.com, pub-9557089510405422, RESELLER, f08c47fec0942fa0
+google.com, pub-9557089510405422, RESELLER, f08c47fec0942fa0 # 33 Across
+google.com, pub-9685734445476814, RESELLER, f08c47fec0942fa0
+google.com, pub-9685734445476814, RESELLER, f08c47fec0942fa0 # DistrictM
+google.com,pub-3848273848634341,reseller,f08c47fec0942fa0
+google.com,pub-9557089510405422,reseller,f08c47fec0942fa0
+gumgum.com, 11645, RESELLER, ffdef49475d318a9
+gumgum.com, 13174, DIRECT, ffdef49475d318a9
+gumgum.com, 13318, RESELLER, ffdef49475d318a9
+gumgum.com, 13318, RESELLER, ffdef49475d318a9 # 33 Across
+gumgum.com, 13504, RESELLER, ffdef49475d318a9
+gumgum.com,13174,DIRECT,ffdef49475d318a9
+gumgum.com,14141,RESELLER,ffdef49475d318a9
+improvedigital.com, 1362, RESELLER
+improvedigital.com, 1669, RESELLER # ImproveDigital
+improvedigital.com, 185, RESELLER
+indexexchange.com, 175407, RESELLER
+indexexchange.com, 177754, RESELLER, 50b1c356f2c5c8fc
+indexexchange.com, 182257, RESELLER, 50b1c356f2c5c8fc # RhythmOne
+indexexchange.com, 183965, RESELLER, 50b1c356f2c5c8fc # AOL - One
+indexexchange.com, 184914, DIRECT, 50b1c356f2c5c8fc
+indexexchange.com, 186046, RESELLER
+indexexchange.com, 186248, DIRECT, 50b1c356f2c5c8fc
+indexexchange.com, 187196, DIRECT
+indexexchange.com, 187454, DIRECT, 50b1c356f2c5c8fc
+indexexchange.com, 189744, RESELLER
+indexexchange.com, 189872, RESELLER
+indexexchange.com, 191503, RESELLER, 50b1c356f2c5c8fc
+indexexchange.com, 191740, RESELLER, 50b1c356f2c5c8fc # Index
+indexexchange.com, 191923, RESELLER
+indexexchange.com, 191973, RESELLER, 50b1c356f2c5c8fc
+indexexchange.com, 193351, DIRECT
+lijit.com, 217352, DIRECT, fafdf38b16bf6b2b
+lijit.com, 217352-eb, DIRECT, fafdf38b16bf6b2b
+lijit.com, 248396, DIRECT, fafdf38b16bf6b2b
+lijit.com, 248396-eb, DIRECT, fafdf38b16bf6b2b
+lijit.com, 260380, RESELLER, fafdf38b16bf6b2b
+lijit.com, 270524, RESELLER, fafdf38b16bf6b2b
+lijit.com,217352,DIRECT,fafdf38b16bf6b2b
+lkqd.com, 470, RESELLER, 59c49fa9598a0117
+lkqd.net, 470, RESELLER, 59c49fa9598a0117
+Newormedia.com, 2169, DIRECT
+newormedia.com, 4908, DIRECT
+onetag.com, 572a470226457b8, RESELLER # OneTag
+onetag.com, 664e107d9f2b748, RESELLER #yieldmo
+onomagic.com, 202921, DIRECT
+openx.com, 539824308, RESELLER, 6a698e2ec38604c6
+openx.com, 537120563, RESELLER, 6a698e2ec38604c6
+openx.com, 537120563, RESELLER, 6a698e2ec38604c6 # 33 Across
+openx.com, 537120960, RESELLER
+openx.com, 537127577, RESELLER, 6a698e2ec38604c6
+Openx.com, 537143344, RESELLER
+openx.com, 537149485, RESELLER, 6a698e2ec38604c6
+openx.com, 537150004, DIRECT, 6a698e2ec38604c6
+openx.com, 537153209, RESELLER, 6a698e2ec38604c6
+openx.com, 538959099, RESELLER
+openx.com, 538959099, RESELLER, 6a698e2ec38604c6
+openx.com, 539699341, DIRECT, 6a698e2ec38604c6
+openx.com, 539824308, RESELLER, 6a698e2ec38604c6
+openx.com, 540003333, RESELLER, 6a698e2ec38604c6
+openx.com, 540031703, RESELLER, 6a698e2ec38604c6
+openx.com, 540031703, RESELLER, 6a698e2ec38604c6 # Conversant
+openx.com, 540258065, RESELLER, 6a698e2ec38604c6
+openx.com, 540274407, RESELLER, 6a698e2ec38604c6
+openx.com, 540337213, RESELLER, 6a698e2ec38604c6
+openx.com, 540401713, RESELLER, 6a698e2ec38604c6 # OpenX
+openx.com, 541159484, RESELLER, 6a698e2ec38604c6
+openx.com, 542511596, RESELLER, 6a698e2ec38604c6
+openx.com, 83499, RESELLER
+openx.com,537149485,reseller,6a698e2ec38604c6
+openx.com,540191398,RESELLER,6a698e2ec38604c6
+openx.com,540833447, RESELLER, 6a698e2ec38604c6
+outbrain.com, 01a755b08c8c22b15d46a8b753ab6955d4, DIRECT
+outbrain.com, 01a755b08c8c22b15d46a8b753ab6955d4, RESELLER
+outbrain.com,00254374f0c468f3b2732db17fd42cb6e5,reseller
+pubmatic.com, 137711, RESELLER
+pubmatic.com, 137711, RESELLER, 5d62403b186f2ace
+pubmatic.com, 156084, RESELLER, 5d62403b186f2ace # AOL - One
+pubmatic.com, 156212, RESELLER
+pubmatic.com, 156212, RESELLER, 5d62403b186f2ace
+pubmatic.com, 156307, RESELLER, 5d62403b186f2ace # Taboola
+pubmatic.com, 156319, DIRECT, 5d62403b186f2ace
+pubmatic.com, 156325, RESELLER, 5d62403b186f2ace # AOL - One
+pubmatic.com, 156344, RESELLER, 5d62403b186f2ace # Pubmatic
+pubmatic.com, 156423, RESELLER, 5d62403b186f2ace
+pubmatic.com, 156423, RESELLER, 5d62403b186f2ace # 33 Across
+pubmatic.com, 156458, RESELLER, 5d62403b186f2ace # AOL - One
+pubmatic.com, 156557, RESELLER
+pubmatic.com, 156595, RESELLER, 5d62403b186f2ace
+pubmatic.com, 157367, DIRECT, 5d62403b186f2ace
+pubmatic.com, 158100, RESELLER, 5d62403b186f2ace
+pubmatic.com, 158355 , RESELLER, 5d62403b186f2ace
+pubmatic.com, 158723, RESELLER, 5d62403b186f2ace
+pubmatic.com, 159117, DIRECT, 5d62403b186f2ace
+pubmatic.com, 159277, RESELLER, 5d62403b186f2ace # RhythmOne
+pubmatic.com, 159330, RESELLER, 5d62403b186f2ace
+pubmatic.com, 159477,RESELLER,5d62403b186f2ace
+pubmatic.com, 160082 , RESELLER, 5d62403b186f2ace
+pubmatic.com, 160131, RESELLER, 5d62403b186f2ace
+pubmatic.com, 32987, RESELLER, 5d62403b186f2ace
+pubmatic.com, 50758, RESELLER, 5d62403b186f2ace
+pubmatic.com, 62483, RESELLER
+pubmatic.com, 79136 , RESELLER, 5d62403b186f2ace
+pubmatic.com,157150,RESELLER,5d62403b186f2ace
+pubmatic.com,157897,reseller,5d62403b186f2ace
+pubmatic.com,160006,RESELLER,5d62403b186f2ace
+pubmatic.com,160096,RESELLER,5d62403b186f2ace
+pubnative.net, 1007284, RESELLER, d641df8625486a7b #yieldmodisplay
+pubnative.net, 1007285, RESELLER, d641df8625486a7b #yieldmonative
+pubnative.net, 1007286, RESELLER, d641df8625486a7b #yieldmovideo
+pubnx.com, 337-1, RESELLER, 8728b7e97e589da4 # Vertoz
+revcontent.com, 76611, RESELLER
+rhythmone.com, 1059622079, RESELLER
+rhythmone.com, 1059622079, RESELLER, a670c89d4a324e47
+rhythmone.com, 1114124056, RESELLER, a670c89d4a324e47
+rhythmone.com, 1166984029, RESELLER, a670c89d4a324e47 # Taboola
+rhythmone.com, 2241341073, RESELLER, a670c89d4a324e47
+rhythmone.com, 2310154583, DIRECT, a670c89d4a324e47
+rhythmone.com, 2439829435, RESELLER, a670c89d4a324e47
+rhythmone.com, 2439829435, RESELLER, a670c89d4a324e47 # 33 Across
+rhythmone.com, 78519861, RESELLER
+rhythmone.com, 905992537, RESELLER, a670c89d4a324e47 # RhythmOne
+rhythmone.com,1654642120,RESELLER,a670c89d4a324e47
+rhythmone.com,2310154583,DIRECT,a670c89d4a324e47
+rhythmone.com,78519861,reseller,a670c89d4a324e47
+rtk.io, 819, DIRECT
+rubiconproject.com, 13344, RESELLER, 0bfd66d529a55807 # Rubicon
+rubiconproject.com, 15268, RESELLER, 0bfd66d529a55807 # RhythmOne
+rubiconproject.com, 16414, RESELLER, 0bfd66d529a55807
+rubiconproject.com, 16414, RESELLER, 0bfd66d529a55807 # 33 Across
+rubiconproject.com, 17070, RESELLER, 0bfd66d529a55807 #yieldmo
+rubiconproject.com, 17632, DIRECT, 0bfd66d529a55807
+rubiconproject.com, 17790, RESELLER, 0bfd66d529a55807
+rubiconproject.com, 17792, RESELLER, 0bfd66d529a55807
+rubiconproject.com, 17822, DIRECT, 0bfd66d529a55807
+rubiconproject.com, 17822, RESELLER, 0bfd66d529a55807
+rubiconproject.com, 17960, RESELLER, 0bfd66d529a55807
+rubiconproject.com, 18222, RESELLER, 0bfd66d529a55807 # AOL - One
+rubiconproject.com, 18694, RESELLER, 0bfd66d529a55807
+rubiconproject.com, 18890, DIRECT, 0bfd66d529a55807
+rubiconproject.com, 20130, RESELLER, 0bfd66d529a55807
+rubiconproject.com, 20416, RESELLER, 0bfd66d529a55807
+rubiconproject.com, 21310, RESELLER , 0bfd66d529a55807
+rubiconproject.com, 21642, RESELLER, 0bfd66d529a55807
+rubiconproject.com, 8861, reseller, 0bfd66d529a55807
+rubiconproject.com,18020,RESELLER,0bfd66d529a55807
+Sekindo.com, 20749, DIRECT, b6b21d256ef43532
+sharethrough.com, 3a0f657b, DIRECT, d53b998a7bd4ecd2
+sharethrough.com, d09156e5, RESELLER, d53b998a7bd4ecd2
+smaato.com, 1100033117, RESELLER
+smaato.com, 1100047713, RESELLER, 07bcf65f187117b4
+smaato.com,1100044650,RESELLER,07bcf65f187117b4
+smartadserver.com, 3436, RESELLER
+sonobi.com, 337f0e70cc, DIRECT
+sonobi.com, 37dd19ad4a, RESELLER, d1a215d9eb5aee9e
+sonobi.com, 6e5cfb5420, DIRECT, d1a215d9eb5aee9e
+sonobi.com, e55fb5d7c2, DIRECT, d1a215d9eb5aee9e
+sovrn.com, 217352, DIRECT, fafdf38b16bf6b2b
+sovrn.com, 248396, DIRECT, fafdf38b16bf6b2b
+sovrn.com, 260380, RESELLER, fafdf38b16bf6b2b
+sovrn.com, 270524, RESELLER, fafdf38b16bf6b2b
+sovrn.com,217352,DIRECT,fafdf38b16bf6b2b
+sparcmedia.com, 310627, Direct
+spotx.tv, 108933, RESELLER, 7842df1d2fe2db34
+spotx.tv, 147949, RESELLER, 7842df1d2fe2db34
+spotx.tv, 212457, RESELLER
+spotx.tv, 228454, RESELLER, 7842df1d2fe2db34
+spotx.tv, 270977, DIRECT, 7842df1d2fe2db34
+spotx.tv, 285547, RESELLER, 7842df1d2fe2db34 # RhythmOne
+spotx.tv, 71451, RESELLER, 7842df1d2fe2db34 # Taboola
+spotx.tv, 84294, RESELLER, 7842df1d2fe2db34
+spotx.tv, 94794, RESELLER, 7842df1d2fe2db34 # SpotX
+spotxchange.com, 108933, RESELLER, 7842df1d2fe2db34
+spotxchange.com, 147949, RESELLER, 7842df1d2fe2db34
+spotxchange.com, 212457, RESELLER
+spotxchange.com, 228454, RESELLER, 7842df1d2fe2db34
+spotxchange.com, 270977, DIRECT, 7842df1d2fe2db34
+spotxchange.com, 285547, RESELLER, 7842df1d2fe2db34 # RhythmOne
+spotxchange.com, 71451, RESELLER, 7842df1d2fe2db34 # Taboola
+spotxchange.com, 84294, RESELLER, 7842df1d2fe2db34
+spotxchange.com, 94794, RESELLER, 7842df1d2fe2db34 # SpotX
+springserve.com, 686, DIRECT, a24eb641fc82e93d
+synacor.com, 82350, RESELLER, e108f11b2cdf7d5b
+synacor.com,82151,reseller,e108f11b2cdf7d5b
+teads.tv, 19014, DIRECT, 15a9c44f6d26cbe1
+telaria.com, mb9eo-oqsbf, RESELLER, 1a4e959a1b50034a
+telaria.com, vtrdn-wjdav, DIRECT, 1a4e959a1b50034a
+telaria.com, vtrdn-ysjam, DIRECT, 1a4e959a1b50034a
+themediagrid.com, P5JONV, RESELLER, 35d5010d7789b49d # Media Grid (IPONWEB)
+tremorhub.com, mb9eo-oqsbf, RESELLER, 1a4e959a1b50034a
+tremorhub.com, vtrdn-wjdav, DIRECT, 1a4e959a1b50034a
+tremorhub.com, vtrdn-ysjam, DIRECT, 1a4e959a1b50034a
+tremorhub.com, z87wm, RESELLER, 1a4e959a1b50034a # Taboola
+triplelift.com, 7205, DIRECT, 6c33edb13117fd86
+ucfunnel.com, par-488A3E6BD8D997D0ED8B3BD34D8BA4B, RESELLER # ucFunnel
+vertamedia.com, 287605, DIRECT, 7de89dc7742b5b11
+vertamedia.com, 287605, RESELLER, 7de89dc7742b5b11
+video.unrulymedia.com, 2310154583, DIRECT
+video.unrulymedia.com, 905992537, RESELLER, a670c89d4a324e47 # RhythmOne
+yahoo.com, 55771, RESELLER, e1a5b5b6e3255540
+yahoo.com, 55104, DIRECT, e1a5b5b6e3255540
+yahoo.com, 55317, RESELLER # Verizon
+yahoo.com, 57289, RESELLER, e1a5b5b6e3255540
+yahoo.com, 57695, DIRECT, e1a5b5b6e3255540
+yahoo.com,55029,RESELLER,e1a5b5b6e3255540
+yieldmo.com, 2417496099628458357, DIRECT
diff --git a/docs/_extra/robots.txt b/docs/_extra/robots.txt
new file mode 100644
index 0000000..eb05362
--- /dev/null
+++ b/docs/_extra/robots.txt
@@ -0,0 +1,2 @@
+User-agent: *
+Disallow:
diff --git a/docs/_static/ad.png b/docs/_static/ad.png
deleted file mode 100644
index 48a7894..0000000
Binary files a/docs/_static/ad.png and /dev/null differ
diff --git a/docs/_static/github-star.css b/docs/_static/github-star.css
new file mode 100644
index 0000000..2c22f28
--- /dev/null
+++ b/docs/_static/github-star.css
@@ -0,0 +1,91 @@
+.github-star {
+ display: flex;
+ align-items: center;
+ justify-content: flex-start;
+ height: 35px;
+ margin: 0 auto 1em;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;
+ font-size: 16px;
+ font-weight: 700;
+ line-height: 22px;
+}
+
+.github-star a {
+ border-bottom: 0;
+}
+
+.github-star__button,
+.github-star__count {
+ box-sizing: border-box;
+ color: #333;
+ text-decoration: none;
+ white-space: nowrap;
+ border: 1px solid #d5d5d5;
+ border-radius: 4px;
+}
+
+.github-star__button {
+ display: inline-flex;
+ align-items: center;
+ gap: 6px;
+ padding: 3px 10px 3px 8px;
+ background-color: #eee;
+ background-image: linear-gradient(to bottom, #fcfcfc 0, #eee 100%);
+}
+
+.github-star__button:hover,
+.github-star__button:focus,
+.github-star__count:hover,
+.github-star__count:focus {
+ color: #0366d6;
+ text-decoration: none;
+}
+
+.github-star__button:hover,
+.github-star__button:focus {
+ background-color: #ddd;
+ background-image: linear-gradient(to bottom, #eee 0, #ddd 100%);
+ border-color: #ccc;
+}
+
+.github-star__icon {
+ flex: 0 0 auto;
+}
+
+.github-star__count {
+ position: relative;
+ display: inline-block;
+ min-width: 56px;
+ margin-left: 6px;
+ padding: 3px 10px;
+ text-align: center;
+ background-color: #fafafa;
+ border-color: #d4d4d4;
+}
+
+.github-star__count::before,
+.github-star__count::after {
+ position: absolute;
+ top: 50%;
+ display: inline-block;
+ width: 0;
+ height: 0;
+ content: "";
+ border-color: transparent;
+ border-style: solid;
+}
+
+.github-star__count::before {
+ left: -5px;
+ margin-top: -6px;
+ border-width: 6px 6px 6px 0;
+ border-right-color: #fafafa;
+}
+
+.github-star__count::after {
+ left: -6px;
+ z-index: -1;
+ margin-top: -7px;
+ border-width: 7px 7px 7px 0;
+ border-right-color: #d4d4d4;
+}
diff --git a/docs/_static/github-star.js b/docs/_static/github-star.js
new file mode 100644
index 0000000..634a74a
--- /dev/null
+++ b/docs/_static/github-star.js
@@ -0,0 +1,44 @@
+(function () {
+ function formatCount(count) {
+ return Number(count).toLocaleString("en-US");
+ }
+
+ function updateStarCount(container, count) {
+ var countLink = container.querySelector("[data-github-star-count]");
+ if (!countLink) {
+ return;
+ }
+
+ var formattedCount = formatCount(count);
+ countLink.textContent = formattedCount;
+ countLink.setAttribute("aria-label", formattedCount + " stargazers on GitHub");
+ }
+
+ Array.prototype.forEach.call(document.querySelectorAll("[data-github-star]"), function (container) {
+ var repo = container.getAttribute("data-github-repo");
+ if (!repo || !window.fetch) {
+ return;
+ }
+
+ window
+ .fetch("https://api.github.com/repos/" + repo, {
+ headers: {
+ Accept: "application/vnd.github+json",
+ },
+ })
+ .then(function (response) {
+ if (!response.ok) {
+ throw new Error("GitHub API request failed");
+ }
+ return response.json();
+ })
+ .then(function (repoData) {
+ if (typeof repoData.stargazers_count === "number") {
+ updateStarCount(container, repoData.stargazers_count);
+ }
+ })
+ .catch(function () {
+ // Keep the server-rendered fallback count visible when the API is unavailable.
+ });
+ });
+})();
diff --git a/docs/_static/guide-book-cover.jpg b/docs/_static/guide-book-cover.jpg
new file mode 100644
index 0000000..abbbc28
Binary files /dev/null and b/docs/_static/guide-book-cover.jpg differ
diff --git a/docs/_static/photos/32800783863_11a00db52c_k_d.jpg b/docs/_static/photos/32800783863_11a00db52c_k_d.jpg
new file mode 100644
index 0000000..649272a
Binary files /dev/null and b/docs/_static/photos/32800783863_11a00db52c_k_d.jpg differ
diff --git a/docs/_static/photos/32800805573_568d6b72fd_k_d.jpg b/docs/_static/photos/32800805573_568d6b72fd_k_d.jpg
new file mode 100644
index 0000000..208bbe8
Binary files /dev/null and b/docs/_static/photos/32800805573_568d6b72fd_k_d.jpg differ
diff --git a/docs/_static/photos/33175624924_7febc46cc4_k_d.jpg b/docs/_static/photos/33175624924_7febc46cc4_k_d.jpg
new file mode 100644
index 0000000..040660b
Binary files /dev/null and b/docs/_static/photos/33175624924_7febc46cc4_k_d.jpg differ
diff --git a/docs/_static/photos/33175625804_e225b90f3e_k_d.jpg b/docs/_static/photos/33175625804_e225b90f3e_k_d.jpg
new file mode 100644
index 0000000..c356d03
Binary files /dev/null and b/docs/_static/photos/33175625804_e225b90f3e_k_d.jpg differ
diff --git a/docs/_static/photos/33467946364_3e59bd376a_k_d.jpg b/docs/_static/photos/33467946364_3e59bd376a_k_d.jpg
new file mode 100644
index 0000000..75a02fd
Binary files /dev/null and b/docs/_static/photos/33467946364_3e59bd376a_k_d.jpg differ
diff --git a/docs/_static/photos/33573755856_7f43d43adf_k_d.jpg b/docs/_static/photos/33573755856_7f43d43adf_k_d.jpg
new file mode 100644
index 0000000..54781c3
Binary files /dev/null and b/docs/_static/photos/33573755856_7f43d43adf_k_d.jpg differ
diff --git a/docs/_static/photos/33573767786_eececc5d27_k_d.jpg b/docs/_static/photos/33573767786_eececc5d27_k_d.jpg
new file mode 100644
index 0000000..1b529fa
Binary files /dev/null and b/docs/_static/photos/33573767786_eececc5d27_k_d.jpg differ
diff --git a/docs/_static/photos/33573769116_49c1ef51e7_k_d.jpg b/docs/_static/photos/33573769116_49c1ef51e7_k_d.jpg
new file mode 100644
index 0000000..a7734c7
Binary files /dev/null and b/docs/_static/photos/33573769116_49c1ef51e7_k_d.jpg differ
diff --git a/docs/_static/photos/33888714601_a1f7d020a2_k_d.jpg b/docs/_static/photos/33888714601_a1f7d020a2_k_d.jpg
new file mode 100644
index 0000000..efdbea5
Binary files /dev/null and b/docs/_static/photos/33888714601_a1f7d020a2_k_d.jpg differ
diff --git a/docs/_static/photos/33907143624_cd621b535c_k_d.jpg b/docs/_static/photos/33907143624_cd621b535c_k_d.jpg
new file mode 100644
index 0000000..d7604c1
Binary files /dev/null and b/docs/_static/photos/33907143624_cd621b535c_k_d.jpg differ
diff --git a/docs/_static/photos/33907149294_82d7535a6c_k_d.jpg b/docs/_static/photos/33907149294_82d7535a6c_k_d.jpg
new file mode 100644
index 0000000..85bb549
Binary files /dev/null and b/docs/_static/photos/33907149294_82d7535a6c_k_d.jpg differ
diff --git a/docs/_static/photos/33907150054_5ee79e8940_k_d.jpg b/docs/_static/photos/33907150054_5ee79e8940_k_d.jpg
new file mode 100644
index 0000000..93e98f4
Binary files /dev/null and b/docs/_static/photos/33907150054_5ee79e8940_k_d.jpg differ
diff --git a/docs/_static/photos/33907150594_9abba7ad0a_k_d.jpg b/docs/_static/photos/33907150594_9abba7ad0a_k_d.jpg
new file mode 100644
index 0000000..480d6e1
Binary files /dev/null and b/docs/_static/photos/33907150594_9abba7ad0a_k_d.jpg differ
diff --git a/docs/_static/photos/33907151034_e0a9e53402_k_d.jpg b/docs/_static/photos/33907151034_e0a9e53402_k_d.jpg
new file mode 100644
index 0000000..ae0136d
Binary files /dev/null and b/docs/_static/photos/33907151034_e0a9e53402_k_d.jpg differ
diff --git a/docs/_static/photos/33907151224_0574e7dfc2_k_d.jpg b/docs/_static/photos/33907151224_0574e7dfc2_k_d.jpg
new file mode 100644
index 0000000..cf218c7
Binary files /dev/null and b/docs/_static/photos/33907151224_0574e7dfc2_k_d.jpg differ
diff --git a/docs/_static/photos/33907152464_a99fdcc8de_k_d.jpg b/docs/_static/photos/33907152464_a99fdcc8de_k_d.jpg
new file mode 100644
index 0000000..91bfebb
Binary files /dev/null and b/docs/_static/photos/33907152464_a99fdcc8de_k_d.jpg differ
diff --git a/docs/_static/photos/33907152824_bf91078cc1_k_d.jpg b/docs/_static/photos/33907152824_bf91078cc1_k_d.jpg
new file mode 100644
index 0000000..7b3151f
Binary files /dev/null and b/docs/_static/photos/33907152824_bf91078cc1_k_d.jpg differ
diff --git a/docs/_static/photos/33925223870_97e44f5629_k_d.jpg b/docs/_static/photos/33925223870_97e44f5629_k_d.jpg
new file mode 100644
index 0000000..b271f26
Binary files /dev/null and b/docs/_static/photos/33925223870_97e44f5629_k_d.jpg differ
diff --git a/docs/_static/photos/33928819683_97b5c6a184_k_d.jpg b/docs/_static/photos/33928819683_97b5c6a184_k_d.jpg
new file mode 100644
index 0000000..8bdd908
Binary files /dev/null and b/docs/_static/photos/33928819683_97b5c6a184_k_d.jpg differ
diff --git a/docs/_static/photos/33928823133_2f3d32cf32_k_d.jpg b/docs/_static/photos/33928823133_2f3d32cf32_k_d.jpg
new file mode 100644
index 0000000..9952120
Binary files /dev/null and b/docs/_static/photos/33928823133_2f3d32cf32_k_d.jpg differ
diff --git a/docs/_static/photos/34018729885_002ced9b54_k_d.jpg b/docs/_static/photos/34018729885_002ced9b54_k_d.jpg
new file mode 100644
index 0000000..5420bb6
Binary files /dev/null and b/docs/_static/photos/34018729885_002ced9b54_k_d.jpg differ
diff --git a/docs/_static/photos/34018732105_f0e6758859_k_d.jpg b/docs/_static/photos/34018732105_f0e6758859_k_d.jpg
new file mode 100644
index 0000000..1a4c3dd
Binary files /dev/null and b/docs/_static/photos/34018732105_f0e6758859_k_d.jpg differ
diff --git a/docs/_static/photos/34151833832_6bdfd930af_k_d.jpg b/docs/_static/photos/34151833832_6bdfd930af_k_d.jpg
new file mode 100644
index 0000000..21fada7
Binary files /dev/null and b/docs/_static/photos/34151833832_6bdfd930af_k_d.jpg differ
diff --git a/docs/_static/photos/34268661876_442428e122_k_d.jpg b/docs/_static/photos/34268661876_442428e122_k_d.jpg
new file mode 100644
index 0000000..f6ce0be
Binary files /dev/null and b/docs/_static/photos/34268661876_442428e122_k_d.jpg differ
diff --git a/docs/_static/photos/34309496175_b82d104282_k_d.jpg b/docs/_static/photos/34309496175_b82d104282_k_d.jpg
new file mode 100644
index 0000000..a09fd0a
Binary files /dev/null and b/docs/_static/photos/34309496175_b82d104282_k_d.jpg differ
diff --git a/docs/_static/photos/34364815780_bea6614025_k_d.jpg b/docs/_static/photos/34364815780_bea6614025_k_d.jpg
new file mode 100644
index 0000000..ab05248
Binary files /dev/null and b/docs/_static/photos/34364815780_bea6614025_k_d.jpg differ
diff --git a/docs/_static/photos/34435687940_8f73fc1fa6_k_d.jpg b/docs/_static/photos/34435687940_8f73fc1fa6_k_d.jpg
new file mode 100644
index 0000000..e765c7c
Binary files /dev/null and b/docs/_static/photos/34435687940_8f73fc1fa6_k_d.jpg differ
diff --git a/docs/_static/photos/34435688380_b5a740762b_k_d.jpg b/docs/_static/photos/34435688380_b5a740762b_k_d.jpg
new file mode 100644
index 0000000..baa1f17
Binary files /dev/null and b/docs/_static/photos/34435688380_b5a740762b_k_d.jpg differ
diff --git a/docs/_static/photos/34435688560_4cc2a7bcbb_k_d.jpg b/docs/_static/photos/34435688560_4cc2a7bcbb_k_d.jpg
new file mode 100644
index 0000000..fe4c1aa
Binary files /dev/null and b/docs/_static/photos/34435688560_4cc2a7bcbb_k_d.jpg differ
diff --git a/docs/_static/photos/34435689480_2e6f358510_k_d.jpg b/docs/_static/photos/34435689480_2e6f358510_k_d.jpg
new file mode 100644
index 0000000..87e2781
Binary files /dev/null and b/docs/_static/photos/34435689480_2e6f358510_k_d.jpg differ
diff --git a/docs/_static/photos/34435690330_11930b5987_k_d.jpg b/docs/_static/photos/34435690330_11930b5987_k_d.jpg
new file mode 100644
index 0000000..74b44e0
Binary files /dev/null and b/docs/_static/photos/34435690330_11930b5987_k_d.jpg differ
diff --git a/docs/_static/photos/34435690580_3afec7d4cd_k_d.jpg b/docs/_static/photos/34435690580_3afec7d4cd_k_d.jpg
new file mode 100644
index 0000000..4a00c54
Binary files /dev/null and b/docs/_static/photos/34435690580_3afec7d4cd_k_d.jpg differ
diff --git a/docs/_static/photos/34484834733_5b80f65ab1_k_d.jpg b/docs/_static/photos/34484834733_5b80f65ab1_k_d.jpg
new file mode 100644
index 0000000..8a667d2
Binary files /dev/null and b/docs/_static/photos/34484834733_5b80f65ab1_k_d.jpg differ
diff --git a/docs/_static/photos/34575689432_3de8e9a348_k_d.jpg b/docs/_static/photos/34575689432_3de8e9a348_k_d.jpg
new file mode 100644
index 0000000..88c760e
Binary files /dev/null and b/docs/_static/photos/34575689432_3de8e9a348_k_d.jpg differ
diff --git a/docs/_static/photos/34689432801_78d97ecec9_k_d.jpg b/docs/_static/photos/34689432801_78d97ecec9_k_d.jpg
new file mode 100644
index 0000000..50554cf
Binary files /dev/null and b/docs/_static/photos/34689432801_78d97ecec9_k_d.jpg differ
diff --git a/docs/_static/photos/34689452831_93d7fd0571_k_d.jpg b/docs/_static/photos/34689452831_93d7fd0571_k_d.jpg
new file mode 100644
index 0000000..ab2ae07
Binary files /dev/null and b/docs/_static/photos/34689452831_93d7fd0571_k_d.jpg differ
diff --git a/docs/_static/photos/34725946825_0f85497e60_k_d.jpg b/docs/_static/photos/34725946825_0f85497e60_k_d.jpg
new file mode 100644
index 0000000..5d58e91
Binary files /dev/null and b/docs/_static/photos/34725946825_0f85497e60_k_d.jpg differ
diff --git a/docs/_static/photos/34725951345_c8f5959a2e_k_d.jpg b/docs/_static/photos/34725951345_c8f5959a2e_k_d.jpg
new file mode 100644
index 0000000..c982f1f
Binary files /dev/null and b/docs/_static/photos/34725951345_c8f5959a2e_k_d.jpg differ
diff --git a/docs/_static/photos/35254379756_c9fe23f843_k_d.jpg b/docs/_static/photos/35254379756_c9fe23f843_k_d.jpg
new file mode 100644
index 0000000..c255607
Binary files /dev/null and b/docs/_static/photos/35254379756_c9fe23f843_k_d.jpg differ
diff --git a/docs/_static/photos/35294660055_42c02b2316_k_d.jpg b/docs/_static/photos/35294660055_42c02b2316_k_d.jpg
new file mode 100644
index 0000000..f7cc6b9
Binary files /dev/null and b/docs/_static/photos/35294660055_42c02b2316_k_d.jpg differ
diff --git a/docs/_static/photos/35620636012_f66aa88f93_k_d.jpg b/docs/_static/photos/35620636012_f66aa88f93_k_d.jpg
new file mode 100644
index 0000000..e3a1b74
Binary files /dev/null and b/docs/_static/photos/35620636012_f66aa88f93_k_d.jpg differ
diff --git a/docs/_static/photos/36137232412_fdcb0f84eb_k_d.jpg b/docs/_static/photos/36137232412_fdcb0f84eb_k_d.jpg
new file mode 100644
index 0000000..ed1364a
Binary files /dev/null and b/docs/_static/photos/36137232412_fdcb0f84eb_k_d.jpg differ
diff --git a/docs/_static/photos/36137234682_be6898bf57_k_d.jpg b/docs/_static/photos/36137234682_be6898bf57_k_d.jpg
new file mode 100644
index 0000000..fed8514
Binary files /dev/null and b/docs/_static/photos/36137234682_be6898bf57_k_d.jpg differ
diff --git a/docs/_static/social-card.jpg b/docs/_static/social-card.jpg
new file mode 100644
index 0000000..9f74ef1
Binary files /dev/null and b/docs/_static/social-card.jpg differ
diff --git a/docs/_templates/github_star.html b/docs/_templates/github_star.html
new file mode 100644
index 0000000..2282927
--- /dev/null
+++ b/docs/_templates/github_star.html
@@ -0,0 +1,33 @@
+
+
+
diff --git a/docs/_templates/hacks.html b/docs/_templates/hacks.html
index 9c925d1..cea323b 100644
--- a/docs/_templates/hacks.html
+++ b/docs/_templates/hacks.html
@@ -1,45 +1 @@
-
-
-
-
-
-
-
-
diff --git a/docs/_templates/layout.html b/docs/_templates/layout.html
new file mode 100644
index 0000000..6a6a22b
--- /dev/null
+++ b/docs/_templates/layout.html
@@ -0,0 +1,113 @@
+{% extends "!layout.html" %}
+
+{%- block extrahead %}
+ {# No super() because we want to avoid loading an empty custom.css file #}
+
+ {# #}
+
+
+
+
+ {% if pagename == 'index' %}
+
+
+ {% elif pagename == '404' %}
+ {# No canonical on our 404 template. #}
+ {% else %}
+
+
+ {% endif %}
+
+
+
+
+
+
+
+
+
+
+ {%- if metatags is defined %}
+ {# FIXME: For some reason the `meta` dict is always empty. Extract the desc from the `metatags` text. #}
+
+ {%- endif %}
+
+
+
+
+
+
+ {# Alabaster theme native GA integration is outdated (ga.js). #}
+ {# Insert our own GA snippet instead. #}
+
+{% endblock %}
+
+{# From: https://github.com/bitprophet/alabaster/blob/5f249677242be96601e034edb3697b7482a6abcf/alabaster/layout.html #}
+{# Nav should appear before content, not after #}
+{%- block content %}
+{%- if theme_fixed_sidebar|lower == 'true' %}
+
+ {{ sidebar() }}
+ {%- block document %}
+
+ {%- if render_sidebar %}
+
+ {%- endif %}
+
+ {%- block relbar_top %}
+ {%- if theme_show_relbar_top|tobool %}
+
+
+ {{- rellink_markup () }}
+
+ {%- endif %}
+ {% endblock %}
+
+
+
+ {% block body %} {% endblock %}
+
+
+ {%- block relbar_bottom %}
+ {%- if theme_show_relbar_bottom|tobool %}
+
+
+ {{- rellink_markup () }}
+
+ {%- endif %}
+ {% endblock %}
+
+ {%- if render_sidebar %}
+
+ {%- endif %}
+
+ {%- endblock %}
+
+
+{%- else %}
+{{ super() }}
+{%- endif %}
+{%- endblock %}
+
+{%- block footer %}
+
+{% endblock %}
diff --git a/docs/_templates/sidebarintro.html b/docs/_templates/sidebarintro.html
index edd7b20..80c6443 100644
--- a/docs/_templates/sidebarintro.html
+++ b/docs/_templates/sidebarintro.html
@@ -1,81 +1,125 @@
-
+
+{% include "github_star.html" %}
+
+
+
+
+
+
这份较为主观的指南旨在为Python初学者和专家提供一个关于Python安装、配置、和日常使用的最佳实践手册。
-得到通知
-获得新版本和未来项目的更新。
-
-
-
-
-
-
-
-加入邮件列表.
-表示感谢
-
-
-
-
-
-
+
O'Reilly 书籍
这份指南现在有纸质版啦!
-
-
-所有的收入都直接捐赠给 DjangoGirls 组织。
-
-
-
-其他项目
+
+
+
-更多 Kenneth Reitz 项目:
-
+
+ 所有的收入都直接捐赠给
+ DjangoGirls 组织。
+
贡献者
这份指南是世界各地
- 数百人
+ 数百人
的成果, 也
- 欢迎您来贡献!
+ 欢迎您来贡献!
-
有用的链接
翻译
diff --git a/docs/_templates/sidebarlogo.html b/docs/_templates/sidebarlogo.html
index 90fabac..c510420 100644
--- a/docs/_templates/sidebarlogo.html
+++ b/docs/_templates/sidebarlogo.html
@@ -4,60 +4,54 @@
+{% include "github_star.html" %}
+
+
+
+
+
+
- 本指南目前持续不断地更新与完善。这份较为主观的指南旨在为Python初学者和专家提供一个关于Python安装、配置、和日常使用的最佳实践手册。
+ 这份较为主观的指南旨在为Python初学者和专家提供一个关于Python安装、配置、和日常使用的最佳实践手册。
-获取更新
-获得新版本和未来项目的更新。
-
-
-
-
-
-
-表示感谢
-加入邮件列表.
-
-
-
-
-
-
+
O'Reilly 书籍
这份指南现在有纸质版啦!
-
+
所有的收入都直接捐赠给 DjangoGirls 组织。
-
-
-其他项目
-
-更多 Kenneth Reitz 项目:
-
-
翻译
diff --git a/docs/conf.py b/docs/conf.py
index 4452d9f..e7f1e58 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -11,7 +11,9 @@
# All configuration values have a default; values that are commented out
# serve to show the default.
-import sys, os
+import os
+import sys
+import datetime
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
@@ -46,7 +48,12 @@
# General information about the project.
project = u'pythonguide'
-copyright = u'2016. A Kenneth Reitz Project. CC BY-NC-SA 3.0'
+current_year = datetime.datetime.now().year
+project = u'pythonguide'
+copyright = (u'2011-{} Kenneth Reitz'
+ ' & Real Python'
+ ' & Prodesire.'
+ ' CC BY-NC-SA 3.0').format(current_year)
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
@@ -197,8 +204,8 @@
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass [howto/manual]).
latex_documents = [
- ('index', 'pythonguide.tex', u'Python Guide Documentation',
- u'Kenneth Reitz', 'manual'),
+ ('index', 'pythonguide.tex', u'Python Guide Documentation',
+ u'Kenneth Reitz', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
@@ -241,7 +248,7 @@
epub_title = u'pythonguide'
epub_author = u'Kenneth Reitz'
epub_publisher = u'Kenneth Reitz'
-epub_copyright = u'2016, Kenneth Reitz'
+epub_copyright = u'2011–{}, Kenneth Reitz & Real Python & Prodesire'.format(current_year)
# The language of the text. It defaults to the language option
# or en if the language is not set.
@@ -279,5 +286,5 @@
todo_include_todos = True
intersphinx_mapping = {
- 'python': ('http://docs.python.org/', None),
+ 'python': ('https://docs.python.org/', None),
}
diff --git a/docs/contents.rst.inc b/docs/contents.rst.inc
index 0eb173d..9b7a0f4 100644
--- a/docs/contents.rst.inc
+++ b/docs/contents.rst.inc
@@ -92,11 +92,12 @@ Python应用的场景指南
部署优雅的Python代码
--------------------------------
-这部分指南关注部署您的Python代码。
+这部分指南关注分享和部署您的Python代码。
.. toctree::
:maxdepth: 2
+ shipping/publishing
shipping/packaging
shipping/freezing
diff --git a/docs/dev/env.rst b/docs/dev/env.rst
index f499ba2..24373b6 100644
--- a/docs/dev/env.rst
+++ b/docs/dev/env.rst
@@ -1,7 +1,7 @@
您的开发环境
============================
-.. image:: https://farm3.staticflickr.com/2930/33175624924_7febc46cc4_k_d.jpg
+.. image:: /_static/photos/33175624924_7febc46cc4_k_d.jpg
文本编辑器
@@ -77,28 +77,28 @@ SuperTab_ 是一个小的Vim插件,通过使用 ```` 或任何其他定
.. _indent: http://www.vim.org/scripts/script.php?script_id=974
.. _syntax: http://www.vim.org/scripts/script.php?script_id=790
.. _Pyflakes: http://pypi.python.org/pypi/pyflakes/
-.. _pycodestyle: https://pypi.python.org/pypi/pycodestyle/
-.. _syntastic: https://github.com/scrooloose/syntastic
-.. _Python-mode: https://github.com/klen/python-mode
+.. _pycodestyle: https://pypi.org/project/pycodestyle/
+.. _syntastic: https://github.com/vim-syntastic/syntastic
+.. _Python-mode: https://github.com/python-mode/python-mode
.. _SuperTab: http://www.vim.org/scripts/script.php?script_id=1643
.. _vim-flake8: https://github.com/nvie/vim-flake8
Emacs
-----
-Emacs是另一个强大的文本编辑器。它是完全可编程的(lisp),但要正确的工作要花些功夫。
+Emacs是另一个强大的文本编辑器。它是完全可编程的(Lisp),但要正确的工作要花些功夫。
如果您已经是一名Emacs的用户了,在EmacsWiki上的 `Python Programming in Emacs`_
将会是好的开始。
1. Emacs 本身支持Python模式。
-.. _Python Programming in Emacs: http://emacswiki.org/emacs/PythonProgrammingInEmacs
+.. _Python Programming in Emacs: https://www.emacswiki.org/emacs/PythonProgrammingInEmacs
TextMate
--------
`TextMate `_ 将苹果操作系统技术带入了文本编辑器的世界。
-通过桥接UNIX和GUI,TextMate将两者中最好的部分带给了脚本专家和新手用户。
+通过桥接Unix和GUI,TextMate将两者中最好的部分带给了脚本专家和新手用户。
Sublime Text
------------
@@ -117,9 +117,17 @@ Atom
所喜欢的编辑器的任何优秀特性,并构建于atom-shell上。
Atom是web原生的(HTML、CSS、JS),专注于模块化的设计和简单的插件开发。它自带本地包管理
-和大量的包。Python开发所推荐的插件是 `Linter `_
+和大量的包。Python开发所推荐的插件是 `Linter `_
和 `linter-flake8 `_ 的组合。
+Python (on Visual Studio Code)
+------------------------------
+
+`Python for Visual Studio Code `_ 是 `Visual Studio Code `_ 的扩展。
+它是一个免费、轻量级的开源编辑器,支持 Mac、Windows 和 Linux。
+使用 Node.js 和 Python 等开源技术构建,具有 Intellisense(自动完成)、本地和远程调试、linting 等引人注目的功能。
+
+MIT 许可。
IDEs
::::
@@ -130,13 +138,13 @@ PyCharm / IntelliJ IDEA
`PyCharm `_ 由JetBrains公司开发,此公司还以
IntelliJ IDEA闻名。它们都共享着相同的基础代码,PyCharm中大多数特性能通过免费的
`Python 插件 `_
-带入到IntelliJ中。PyCharm由两个版本:专业版(Professional Edition)(30天试用)和
+带入到IntelliJ中。PyCharm有两个版本:专业版(Professional Edition)(30天试用)和
拥有相对少特性的社区版(Community Edition)(Apache 2.0 License)。
-Python (在 Visual Studio Code中)
+Python (在 Visual Studio Code 中)
-----------------------------------------
-`用于Visual Studio的Python `_
+`用于Visual Studio的Python `_
是一款用于 `Visual Studio Code IDE `_ 的扩展。
它是一个免费的、轻量的、开源的IDE,支持Mac、Windows和Linux。它以诸如Node.js和Python等
开源技术构建,具有如Intellisense(自动补全)、本地和远程调试、linting(代码检查)等
@@ -146,19 +154,19 @@ MIT 许可证。
Enthought Canopy
----------------
-`Enthought Canopy `_ 是一款专门面向科学家
+`Enthought Canopy `_ 是一款专门面向科学家
和工程师的Python IDE,它预装了为数据分析而用的库。
Eclipse
-------
-Eclipse中进行Python开发最流行的插件是Aptana的 `PyDev `_ 。
+Eclipse中进行Python开发最流行的插件是Aptana的 `PyDev `_ 。
Komodo IDE
----------
-`Komodo IDE `_ 由ActiveState开发,并且是
+`Komodo IDE `_ 由ActiveState开发,并且是
在Windows、Mac和Linux平台上的商业IDE。
@@ -166,8 +174,8 @@ Spyder
------
`Spyder `_ 是一款专门面向和Python科学库
-(即 `Scipy `_ )打交道的IDE。它集成了 pyflakes_ 、
-`pylint `_ 和 `rope `_ 。
+(即 `SciPy `_ )打交道的IDE。它集成了 pyflakes_ 、
+`pylint `_ 和 `rope `_ 。
Spyder是开源的(免费的),提供了代码补全、语法高亮、类和函数浏览器,以及对象检查的功能。
@@ -200,6 +208,16 @@ Eric (The Eric Python IDE)
Python Shell、集成的调试器和灵活的插件系统等功能。它基于Qt GUI工具集,使用Python编写,
集成了Scintilla编辑器控制。Eric是一款超过10年活跃开发的开源软件工程(GPLv3许可)。
+Mu
+--
+
+`Mu `_ 是一个极简的 Python IDE,它可以在本地运行 Python 3 代码,也可以将代码部署到 BBC micro:bit
+和运行 CircuitPython 的 Adafruit 板上。
+
+Mu 为初学者设计,包含一个 Python 3 解释器,易于安装在 Windows、OS/X 和 Linux 上,还能在 Raspberry Pi 上很好地运行。
+
+gitter 上有一个 Mu 活跃的支持社区。
+
解释器工具
:::::::::::::::::
@@ -212,18 +230,18 @@ Python Shell、集成的调试器和灵活的插件系统等功能。它基于Qt
因此就能避免潜在的版本冲突。
To start using and see more information:
-`Virtual Environments `_ docs.
+`Virtual Environments `_ docs.
开始使用和查阅更多信息:请参阅 `Virtual Environments `_ 文档。
pyenv
-----
-`pyenv `_ 是一个允许多个Python解释器版本同时安装
+`pyenv `_ 是一个允许多个Python解释器版本同时安装
于一台机器的工具。这解决了不同的项目需要不同版本的Python的问题。比如,为了兼容性,
可以很容易地为一个项目安装Python 2.7,而继续使用Python 3.4作为默认的编辑器。
-pyenv不止限于CPython版本——它还能安装PyPy、anaconda、miniconda、stackless、jython
-和ironpython解释器。
+pyenv不止限于CPython版本——它还能安装PyPy、Anaconda、miniconda、stackless、Jython
+和IronPython解释器。
pyenv的工作原理是在一个叫做 ``shims`` 目录中创建Python解释器(以及其他工具像
``pip`` 和 ``2to3`` 等)的假版本。当系统寻找名为 ``python`` 的应用时,
@@ -231,7 +249,7 @@ pyenv的工作原理是在一个叫做 ``shims`` 目录中创建Python解释器
pyenv基于环境变量、 ``.python-version`` 文件和全局默认设置的信息就知道该运行
哪个版本的Python。
-pyenv不是管理虚拟环境的工具,但是有一个叫做 `pyenv-virtualenv `_
+pyenv不是管理虚拟环境的工具,但是有一个叫做 `pyenv-virtualenv `_
的插件可以自动化不同环境的创建,而且也能够使用现有的pyenv工具,基于环境变量或者
``.python-version`` 文件,来切换不同的环境。
@@ -241,7 +259,7 @@ pyenv不是管理虚拟环境的工具,但是有一个叫做 `pyenv-virtualenv
IDLE
----
-:ref:`IDLE ` 是一个集成的开发环境,它是Python标准库的一部分。
+:ref:`IDLE ` 是一个集成的开发环境,它是Python标准发行的一部分。
它完全由Python编写,并使用Tkinter GUI工具集。尽管IDLE不适用于作为成熟的Python开发工具,
但它对尝试小的Python代码和对Python不同特性的实验非常有帮助。
@@ -258,11 +276,11 @@ IPython
`IPython `_ 提供一个丰富的工具集来帮助您最大限度地和Python交互。
它主要的组件有:
-* 强大的Python shell(终端和基于Qt)。
-* 一个基于网络的笔记本,拥有相同的核心特性,但是支持富媒体、文本、代码、数学表达式和内联绘图。
-* 支持交互式的数据可视化和GUI工具集的使用。
-* 灵活、嵌入的解释器载入到您的工程工程中。
-* 支持高级可交互的并行计算的工具。
+* 强大的Python shell(终端和基于Qt)
+* 一个基于网络的笔记本,拥有相同的核心特性,但是支持富媒体、文本、代码、数学表达式和内联绘图
+* 支持交互式的数据可视化和GUI工具集的使用
+* 灵活、嵌入的解释器载入到您的工程工程中
+* 支持高级可交互的并行计算的工具
.. code-block:: console
@@ -277,17 +295,17 @@ IPython
BPython
-------
-`bpython `_ 在类Unix操作系统中可替代Python解释器的接口。
+`bpython `_ 在类Unix操作系统中可替代Python解释器的接口。
它有以下特性:
-* 内联的语法高亮。
-* 行内输入时的自动补全建议。
-* 任何Python函数的期望参数列表。
-* 从内存中pop出代码的最后一行并重新运行(re-evaluate)的“倒带”功能.
-* 将输入的代码发送到pastebin。
-* 将输入的代码保存到一个文件中。
-* 自动缩进。
-* 支持Python 3。
+* 内联的语法高亮
+* 行内输入时的自动补全建议
+* 任何Python函数的期望参数列表
+* 从内存中pop出代码的最后一行并重新运行(re-evaluate)的“倒带”功能
+* 将输入的代码发送到pastebin
+* 将输入的代码保存到一个文件中
+* 自动缩进
+* 支持Python 3
.. code-block:: console
@@ -296,16 +314,16 @@ BPython
ptpython
--------
-`ptpython `_ 是一个构建在
-`prompt_toolkit `_
+`ptpython `_ 是一个构建在
+`prompt_toolkit `_
库顶部的REPL。它被视作是 BPython_ 的替代。特性包括:
* 语法高亮
* 自动补全
* 多行编辑
-* Emacs和VIM模式
+* Emacs和Vim模式
* 代码中嵌入的REPL
-* 语法合法性
+* 语法校验
* Tab页
* 通过安装Ipython ``pip install ipython`` 并运行 ``ptipython`` ,支持集成 IPython_ 的 shell
diff --git a/docs/dev/pip-virtualenv.rst b/docs/dev/pip-virtualenv.rst
index 9499f5a..69aee49 100644
--- a/docs/dev/pip-virtualenv.rst
+++ b/docs/dev/pip-virtualenv.rst
@@ -41,7 +41,7 @@ Pip和Virtualenv的更多配置
.. code-block:: console
- %HOME%\pip\pip.ini
+ %USERPROFILE%\pip\pip.ini
如果在这些位置中并没有 :file:`pip.conf` 或 :file:`pip.ini` ,
您可以在对应的操作系统中创建一个正确名字的新文件。
@@ -67,7 +67,7 @@ Pip和Virtualenv的更多配置
.. code-block:: console
gpip() {
- PIP_REQUIRE_VIRTUALENV="" pip "$@"
+ PIP_REQUIRE_VIRTUALENV=false pip "$@"
}
在保存完这个修改以及使用 ``source ~/.bashrc`` 来source一下 :file:`~/.bashrc`
@@ -82,9 +82,12 @@ Pip和Virtualenv的更多配置
比如说,您可能在多个不同的项目上使用了 ``requests`` 。
每当您开始一个新项目(并有一个新的虚拟环境)重新下载相同的包/库是没有必要的。幸运的是,
-您能通过下面的方式去配置pip来重用已经安装的库。
+自从6.0版本开始,pip提供 `默认缓存机制
+`_ 而无需任何配置。
-在UNIX系统中,您可以添加以下两行到您的 :file:`.bashrc` 或 :file:`.bash_profile` 文件中。
+当使用更老的版本时,你可以用下面的方式来配置pip,以使它尝试重用已安装的包。
+
+在Unix系统中,您可以添加以下两行到您的 :file:`.bashrc` 或 :file:`.bash_profile` 文件中。
.. code-block:: console
@@ -99,9 +102,9 @@ Pip和Virtualenv的更多配置
.. code-block:: console
- download-cache = %HOME%\pip\cache
+ download-cache = %USERPROFILE%\pip\cache
-类似的,如果您使用UNIX,就将下面一行添加到 :file:`pip.conf` 文件中的 ``[global]`` 设置下:
+类似的,如果您使用Unix,就将下面一行添加到 :file:`pip.conf` 文件中的 ``[global]`` 设置下:
.. code-block:: console
diff --git a/docs/dev/virtualenvs.rst b/docs/dev/virtualenvs.rst
index 5be9c26..5581b60 100644
--- a/docs/dev/virtualenvs.rst
+++ b/docs/dev/virtualenvs.rst
@@ -21,7 +21,7 @@ Python 用于许多不同的目的。准确地说,您希望如何管理依赖
在您进一步之前,请确保您有 Python,并且可从您的命令行中获得。
您可以通过简单地运行以下命令来检查:
-.. code-block:: bash
+.. code-block:: console
$ python --version
@@ -37,12 +37,12 @@ Python 用于许多不同的目的。准确地说,您希望如何管理依赖
File "", line 1, in
NameError: name 'python' is not defined
- 这是因为此命令要在 *shell*(也称为 *终端* 或 *控制台*)中运行。有关使用操作系统的
+ 这是因为此命令要在 *shell* (也称为 *终端* 或 *控制台*)中运行。有关使用操作系统的
shell 并和 Python 进行交互的介绍,请参阅面向 Python 新手的 `入门教程`_。
-另外,您需要确保 ``pip`` 是可用的。您可以通过运行以下命令来检查:
+另外,您需要确保 `pip`_ 是可用的。您可以通过运行以下命令来检查:
-.. code-block:: bash
+.. code-block:: console
$ pip --version
@@ -52,20 +52,21 @@ Python 用于许多不同的目的。准确地说,您希望如何管理依赖
.. _入门教程: https://opentechschool.github.io/python-beginners/en/getting_started.html#what-is-python-exactly
.. _python.org: https://python.org
+.. _pip: https://pypi.org/project/pip/
.. _Homebrew: https://brew.sh
-.. _安装 Python: http://docs.python-guide.org/en/latest/starting/installation/
+.. _安装 Python: https://docs.python-guide.org/starting/installation/
安装 Pipenv
-----------------
-``Pipenv`` 是 Python 项目的依赖管理器。如果您熟悉 Node.js 的 `npm`_ 或
-Ruby 的 `bundler`_,那么它们在思路上与这些工具类似。尽管 ``pip`` 可以安装 Python 包,
+`Pipenv`_ 是 Python 项目的依赖管理器。如果您熟悉 Node.js 的 `npm`_ 或
+Ruby 的 `bundler`_,那么它们在思路上与这些工具类似。尽管 `pip`_ 可以安装 Python 包,
但仍推荐使用 Pipenv,因为它是一种更高级的工具,可简化依赖关系管理的常见使用情况。
使用 ``pip`` 来安装 Pipenv:
-.. code-block:: shell
+.. code-block:: console
$ pip install --user pipenv
@@ -75,7 +76,7 @@ Ruby 的 `bundler`_,那么它们在思路上与这些工具类似。尽管 ``p
在 Linux 和 macOS 上,您可以通过运行 ``python -m site --user-base`` 找到
用户基础目录,然后把 ``bin`` 加到目录末尾。比如,上述命令典型地会打印出
- ``~/.local``( ``~`` 会扩展为您的家目录的局对路径),然后将 ``~/.local/bin``
+ ``~/.local`` ( ``~`` 会扩展为您的家目录的绝对路径),然后将 ``~/.local/bin``
添加到 ``PATH`` 中。您可以通过 `修改 ~/.profile`_ 永久地设置 ``PATH``。
在 Windows 上,您通过运行 ``py -m site --user-site`` 找到用户基础目录,然后
@@ -84,6 +85,7 @@ Ruby 的 `bundler`_,那么它们在思路上与这些工具类似。尽管 ``p
``PATH`` 中包含 ``C:\Users\Username\AppData\Roaming\Python36\Scripts``。
您可以在 `控制面板`_ 中永久设置用户的 ``PATH``。您可能需要登出 ``PATH`` 更改才能生效。
+.. _Pipenv: https://pipenv.kennethreitz.org/
.. _npm: https://www.npmjs.com/
.. _bundler: http://bundler.io/
.. _用户基础目录: https://docs.python.org/3/library/site.html#site.USER_BASE
@@ -97,15 +99,17 @@ Ruby 的 `bundler`_,那么它们在思路上与这些工具类似。尽管 ``p
Pipenv 管理每个项目的依赖关系。要安装软件包时,请更改到您的项目目录(或只是本教程中的
一个空目录)并运行:
-.. code-block:: bash
+.. code-block:: console
- $ cd myproject
+ $ cd project_folder
$ pipenv install requests
-Pipenv 将在您的项目目录中安装超赞的 `Requests`_ 库并为您创建一个 ``Pipfile``。
+Pipenv 将在您的项目目录中安装超赞的 `Requests`_ 库并为您创建一个 `Pipfile`_。
``Pipfile`` 用于跟踪您的项目中需要重新安装的依赖,例如在与他人共享项目时。
您应该得到类似的输出(尽管显示的确切路径会有所不同):
+.. _Pipfile: https://github.com/pypa/pipfile
+
.. code-block:: text
Creating a Pipfile for this project...
@@ -133,7 +137,7 @@ Pipenv 将在您的项目目录中安装超赞的 `Requests`_ 库并为您创建
Adding requests to Pipfile's [packages]...
P.S. You have excellent taste! ✨ 🍰 ✨
-.. _Requests: https://python-requests.org
+.. _Requests: https://requests.readthedocs.io/en/latest/
使用安装好的包
@@ -151,7 +155,7 @@ Pipenv 将在您的项目目录中安装超赞的 `Requests`_ 库并为您创建
然后您就可以使用 ``pipenv run`` 运行这段脚本:
-.. code-block:: bash
+.. code-block:: console
$ pipenv run python main.py
@@ -175,7 +179,7 @@ Pipenv 将在您的项目目录中安装超赞的 `Requests`_ 库并为您创建
更低层次: virtualenv
=======================
-`virtualenv `_ 是一个创建隔绝的Python环境的
+`virtualenv `_ 是一个创建隔绝的Python环境的
工具。virtualenv创建一个包含所有必要的可执行文件的文件夹,用来使用Python工程所需的包。
它可以独立使用,代替Pipenv。
@@ -186,7 +190,7 @@ Pipenv 将在您的项目目录中安装超赞的 `Requests`_ 库并为您创建
$ pip install virtualenv
-测试您的安装
+测试您的安装:
.. code-block:: console
@@ -199,23 +203,23 @@ Pipenv 将在您的项目目录中安装超赞的 `Requests`_ 库并为您创建
.. code-block:: console
- $ cd my_project_folder
- $ virtualenv my_project
+ $ cd project_folder
+ $ virtualenv venv
-``virtualenv my_project`` 将会在当前的目录中创建一个文件夹,包含了Python可执行文件,
-以及 ``pip`` 库的一份拷贝,这样就能安装其他包了。虚拟环境的名字(此例中是 ``my_project`` )
+``virtualenv venv`` 将会在当前的目录中创建一个文件夹,包含了Python可执行文件,
+以及 ``pip`` 库的一份拷贝,这样就能安装其他包了。虚拟环境的名字(此例中是 ``venv`` )
可以是任意的;若省略名字将会把文件均放在当前目录。
-在任何您运行命令的目录中,这会创建Python的拷贝,并将之放在叫做 :file:`my_project`
+在任何您运行命令的目录中,这会创建Python的拷贝,并将之放在叫做 :file:`venv`
的文件中。
-您可以选择使用一个Python解释器(比如``python2.7``):
+您可以选择使用一个Python解释器(比如 ``python2.7`` ):
.. code-block:: console
- $ virtualenv -p /usr/bin/python2.7 my_project
+ $ virtualenv -p /usr/bin/python2.7 venv
-或者使用``~/.bashrc``的一个环境变量将解释器改为全局性的:
+或者使用 ``~/.bashrc`` 的一个环境变量将解释器改为全局性的:
.. code-block:: console
@@ -226,18 +230,27 @@ Pipenv 将在您的项目目录中安装超赞的 `Requests`_ 库并为您创建
.. code-block:: console
- $ source my_project/bin/activate
+ $ source venv/bin/activate
-当前虚拟环境的名字会显示在提示符左侧(比如说 ``(my_project)您的电脑:您的工程 用户名$)
-以让您知道它是激活的。从现在起,任何您使用pip安装的包将会放在 ``my_project`` 文件夹中,
+当前虚拟环境的名字会显示在提示符左侧(比如说 ``(venv)您的电脑:项目目录 用户名$``)
+以让您知道它是激活的。从现在起,任何您使用pip安装的包将会放在 ``venv`` 文件夹中,
与全局安装的Python隔绝开。
-像平常一样安装包,比如:
+对于Windows,可以使用步骤1中提到的相同命令来创建虚拟环境。 只是需要稍微不同的命令来激活环境。
+
+假设您在项目目录中:
+
+.. code-block:: console
+
+ C:\Users\SomeUser\project_folder> venv\Scripts\activate
+
+使用 ``pip`` 命令来安装包:
.. code-block:: console
$ pip install requests
+
3. 如果您在虚拟环境中暂时完成了工作,则可以停用它:
.. code-block:: console
@@ -246,11 +259,11 @@ Pipenv 将在您的项目目录中安装超赞的 `Requests`_ 库并为您创建
这将会回到系统默认的Python解释器,包括已安装的库也会回到默认的。
-要删除一个虚拟环境,只需删除它的文件夹。(要这么做请执行 ``rm -rf my_project`` )
+要删除一个虚拟环境,只需删除它的文件夹。(要这么做请执行 ``rm -rf venv`` )
然后一段时间后,您可能会有很多个虚拟环境散落在系统各处,您将有可能忘记它们的名字或者位置。
-其他注意
+其他注意事项
--------------
运行带 ``--no-site-packages`` 选项的 ``virtualenv`` 将不会包括全局安装的包。
@@ -263,7 +276,7 @@ Pipenv 将在您的项目目录中安装超赞的 `Requests`_ 库并为您创建
$ pip freeze > requirements.txt
这将会创建一个 :file:`requirements.txt` 文件,其中包含了当前环境中所有包及
-各自的版本的简单列表。您可以使用 “pip list”在不产生requirements文件的情况下,
+各自的版本的简单列表。您可以使用 ``pip list`` 在不产生requirements文件的情况下,
查看已安装包的列表。这将会使另一个不同的开发者(或者是您,如果您需要重新创建这样的环境)
在以后安装相同版本的相同包变得容易。
@@ -302,7 +315,7 @@ virtualenvwrapper
$ pip install virtualenvwrapper-win
-在Windows中,WORKON_HOME默认的路径是 %USERPROFILE%\Envs 。
+在Windows中,WORKON_HOME默认的路径是 %USERPROFILE%\\Envs 。
基本使用
--------------
@@ -311,18 +324,18 @@ virtualenvwrapper
.. code-block:: console
- $ mkvirtualenv my_project
+ $ mkvirtualenv project_folder
-这会在 :file:`~/Envs` 中创建 :file:`my_project` 文件夹。
+这会在 :file:`~/Envs` 中创建 :file:`project_folder` 文件夹。
2. 在虚拟环境上工作:
.. code-block:: console
- $ workon my_project
+ $ workon project_folder
或者,您可以创建一个项目,它会创建虚拟环境,并在 ``$WORKON_HOME`` 中创建一个项目目录。
-当您使用 ``workon myproject`` 时,会 ``cd`` -ed 到项目目录中。
+当您使用 ``workon project_folder`` 时,会 ``cd`` 到项目目录中。
.. code-block:: console
@@ -343,7 +356,7 @@ virtualenvwrapper
.. code-block:: console
- $ rmvirtualenv my_project
+ $ rmvirtualenv project_folder
其他有用的命令
-------------------
@@ -368,20 +381,15 @@ virtualenv-burrito
有了 `virtualenv-burrito `_ ,
您就能使用单行命令拥有virtualenv + virtualenvwrapper的环境。
-autoenv
+direnv
-------
-当您 ``cd`` 进入一个包含 :file:`.env` 的目录中,就会 `autoenv `_
+当您 ``cd`` 进入一个包含 :file:`.env` 的目录中,就会 `direnv `_
自动激活那个环境。
使用 ``brew`` 在Mac OS X上安装它:
.. code-block:: console
- $ brew install autoenv
-
-在Linux上:
-
-.. code-block:: console
+ $ brew install direnv
- $ git clone git://github.com/kennethreitz/autoenv.git ~/.autoenv
- $ echo 'source ~/.autoenv/activate.sh' >> ~/.bashrc
+在 Linux 上,根据 `direnv.net `_ 上的指南进行。
diff --git a/docs/index.rst b/docs/index.rst
index f0543d7..f843e4f 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -3,8 +3,12 @@
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
+.. meta::
+ :description: Python编程语言的自我主见指南,也是安装、配置和日常使用Python的最佳实践手册。
+
+#################################
Python最佳实践指南!
-=================================
+#################################
您好,地球人!欢迎来到Python最佳实践指南。
diff --git a/docs/intro/community.rst b/docs/intro/community.rst
index aead83c..3b677ff 100644
--- a/docs/intro/community.rst
+++ b/docs/intro/community.rst
@@ -1,27 +1,30 @@
.. _the-community:
+#############
社区
-=============
+#############
.. image:: https://farm5.staticflickr.com/4225/34689432801_78d97ecec9_k_d.jpg
+****
BDFL
-----
+****
Python的创始人Guido van Rossum 通常被称为BDFL —— 生活的仁慈独裁者。
-
+##########################
Python软件基金会
---------------------------
+##########################
Python软件基金会的任务是促进、保护和发展Python编程语言,同时支持和帮助Python编程者的多样、国际化的社区的成长。
`了解更多关于PSF的内容 `_.
+****
PEPs
-----
+****
PEPs是 *Python 增强提议*。它们描述了Python自身或者相关库的变化。
@@ -63,15 +66,24 @@ PEPs会被同行审阅,并在大量的讨论后决定接受或拒绝。任何
.. image:: ../_static/pep-0001-1.png
+**************************
Python会议
---------------------------
+**************************
Python社区主要的事件就是开发者会议。两个最著名的会议就是在美国举办的PyCon,和在欧洲举办的姊妹版会议EuroPython。
会议的综合列表维护在 `pycon.org `_ 上。
+**************************
Python用户组
---------------------------
+**************************
+
+用户组就是一群Python开发者见面现身或讨论感兴趣的Python话题的地方。一系列本地用户组维护在 `Python 软件基金会 Wiki `_ 中。
+
+**************************
+Python 工作公告栏
+**************************
-用户组就是一群Python开发者见面现身或讨论感兴趣的Python话题的地方。一系列本地用户组维护在 `Python 软件基金会 Wiki `_ 中。
\ No newline at end of file
+`Python Jobs HQ `_ 是一个面向Python开发人员的Python工作公告栏。
+该网站汇总了发布自网络的Python职位,并允许雇主直接在网站上发布Python职位。
\ No newline at end of file
diff --git a/docs/intro/documentation.rst b/docs/intro/documentation.rst
index e6320a7..ce20534 100644
--- a/docs/intro/documentation.rst
+++ b/docs/intro/documentation.rst
@@ -1,10 +1,14 @@
+
+
+#############
文档
-=============
+#############
.. image:: https://farm5.staticflickr.com/4178/33928823133_2f3d32cf32_k_d.jpg
+**********************
官方文档
-----------------------
+**********************
Python语言和库的官方文档能够在这里找到:
@@ -12,16 +16,18 @@ Python语言和库的官方文档能够在这里找到:
- `Python 3.x `_
+**********************
Read the Docs
--------------
+**********************
Read the Docs是一个流行的社区项目,存放着开源软件的文档。它拥有很多Python模块,优秀且流行。
`Read the Docs `_
+*****
pydoc
------
+*****
:program:`pydoc` 是一个在您安装Python时跟着安装的工具。它允许您在shell中快速检索和查找文档。比如,如果您需要对 :mod:`time` 模块的进行快速回顾,查看文档就是像下面这么简单:
diff --git a/docs/intro/duction.rst b/docs/intro/duction.rst
index 1169b10..75cd975 100644
--- a/docs/intro/duction.rst
+++ b/docs/intro/duction.rst
@@ -1,9 +1,12 @@
+
+
+############
介绍
-============
+############
.. image:: https://farm5.staticflickr.com/4180/34725946825_0f85497e60_k_d.jpg
-来自 `Python官方网站 `_ 的介绍:
+来自 `Python官方网站 `_ 的介绍:
Python是一门通用的高级编程语言,类似于Tcl、Perl、Ruby、Scheme或者Java。其一些主要的关键特性包括:
@@ -15,7 +18,7 @@ Python是一门通用的高级编程语言,类似于Tcl、Perl、Ruby、Scheme
Python有时被描述为“自带电池(batteries included)”(引申为“功能完备”),就是因为它拥有大量的 `标准库 `_ ,这包括正则表达式、文件IO、分数处理、对象序列化等。
- 此外,`Python Package Index `_ 允许用户提交他们的包以得到更广泛的使用,类似于Perl的 `CPAN `_ 。Python拥有生机蓬勃的社区,他们开发出非常强大的Python框架和工具,比如 `Django `_ 网络框架和 `NumPy `_ 数学库。
+ 此外,`Python Package Index `_ 允许用户提交他们的包以得到更广泛的使用,类似于Perl的 `CPAN `_ 。Python拥有生机蓬勃的社区,他们开发出非常强大的Python框架和工具,比如 `Django `_ 网络框架和 `NumPy `_ 数学库。
* **和其他系统集成**
@@ -33,8 +36,9 @@ Python是一门通用的高级编程语言,类似于Tcl、Perl、Ruby、Scheme
.. _about-ref:
+################
关于这份指南
-----------------
+################
目的
~~~~~~~
diff --git a/docs/intro/learning.rst b/docs/intro/learning.rst
index 62096ba..02c2655 100644
--- a/docs/intro/learning.rst
+++ b/docs/intro/learning.rst
@@ -1,10 +1,12 @@
+###############
学习Python
-===============
+###############
-.. image:: https://farm3.staticflickr.com/2840/32800783863_11a00db52c_k_d.jpg
+.. image:: /_static/photos/32800783863_11a00db52c_k_d.jpg
+********
初学者
---------
+********
The Python Tutorial
~~~~~~~~~~~~~~~~~~~~
@@ -13,6 +15,20 @@ The Python Tutorial
`The Python Tutorial `_
+Real Python
+~~~~~~~~~~~
+
+Real Python 是由各种专业的Python开发团队创建的免费且深入的Python教程库。在Real Python中,您可以从头开始学习Python的所有内容。从Python的最基础的知识到Web开发和Web爬取,再到数据可视化等等。
+
+ `Real Python `_
+
+Python Basics
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+pythonbasics.org 是初学者的入门教程,包括练习、涵盖了基础知识,还有深入的课程(如面向对象编程和正则表达式)。
+
+ `Python basics `_
+
Python for beginners
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -20,32 +36,30 @@ thepythonguru.com是一个专注于初学程序员的教程。它深入涵盖了
它还教您一些Python的高级概念,如lambda表达式、正则表达式等。最后,它以教程
“如何使用python访问MySQL数据库”结束。
- `Python for beginners `_
-
-交互学习Python数据科学
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-如果您喜欢在线互动环境学习数据科学Python, `DataCamp的免费python教程 `_
-是一个很好的入门方式。如果您已经在机器学习方面有所进步并且感兴趣,请查看这个 `使用scikit监督学习的课程 `_,
-由scikit学习的核心开发人员之一提供。
-
-
-`Python for data science `_
+ `Python for beginners `_
-Learn Python
+Learn Python Interactive Tutorial
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Learnpython.org是一个简单易懂的了解Python的途径。网站采用了和流行的
-`Try Ruby `_ 相同的方式,有一个交互式的Python解释器内建于网站中,
+`Try Ruby `_ 相同的方式,有一个交互式的Python解释器内建于网站中,
允许您在学习Python课程时不需要在本地安装Python。
`Learn Python `_
+Python for You and Me
+~~~~~~~~~~~~~~~~~~~~~
如果您想要更加传统的书籍, *Python For You and Me* 是一个极佳的学习Python所有方面的资源。
`Python for You and Me `
- `Learn Python Interactively with DataCamp! `_
+
+Learn Python Step by Step
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Techbeamers.com 提供了手把手的教程讲解Python。每个教程都补充了相关代码段,并配备了关于所学主题的后续测验。里面的 `Python 面试题 `_ 部分可以帮助求职者。您还可以阅读必备的 `Python 技巧 `_ ,并学习编写高质量代码的 `最佳编程实践 `_ 。在这里,你将获得快速学习Python的正确平台。
+
+`学习 Python 从基础到高级 `_
Online Python Tutor
~~~~~~~~~~~~~~~~~~~
@@ -78,7 +92,7 @@ Learn Python the Hard Way
这是一部极佳的新手编程者的Python指南。它涵盖了从控制台到web的“hello world”。
- `Learn Python the Hard Way `_
+ `Learn Python the Hard Way `_
Crash into Python
@@ -87,7 +101,7 @@ Crash into Python
这个指南也叫 *Python for Programmers with 3 Hours* ,它给有其他语言开发经验的开发人员
一个关于Python的快速教程。
- `Crash into Python `_
+ `Crash into Python `_
Dive Into Python 3
@@ -96,7 +110,7 @@ Dive Into Python 3
Dive Into Python 3对准备使用Python 3的人来说是一本不错的书。如果您是从Python 2迁移到
Python 3或者您已经有其他语言的编程经验,那么将会很好阅读。
- `Dive Into Python 3 `_
+ `Dive Into Python 3 `_
Think Python: How to Think Like a Computer Scientist
@@ -116,18 +130,17 @@ Think Python 通过使用Python语言来介绍计算机科学中的基本概念
Python Koans
~~~~~~~~~~~~
-Python Koans是Edgecase's Ruby Koans的迁移版。它使用测试驱动的方法(参阅TEST DRIVEN
-DESIGN SECTION)提供一个交互式的教程,来讲解基本的Python概念。通过修复在测试脚本中
-失败的断言,从而提供连续的步骤来学习Python。
+Python Koans是Edgecase's Ruby Koans的迁移版。它使用测试驱动的方法提供一个交互式的教程,
+来讲解基本的Python概念。通过修复在测试脚本中失败的断言,从而提供连续的步骤来学习Python。
对于那些使用语言并找出自己的困惑的人来说,这会是个有趣并有吸引力的选择。对于新手来说,
拥有一个额外的资源或者参考会是很有用的。
- `Python Koans `_
+ `Python Koans `_
要了解更多关于测试驱动开发的内容,可以查看以下资源:
- `测试驱动开发 `_
+ `测试驱动开发 `_
A Byte of Python
@@ -140,18 +153,38 @@ A Byte of Python
`A Byte of Python for Python 3.x `_
-Learn to Program in Python with Codeacademy
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Computer Science Path on Codecademy
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-此Codeacademy课程面向绝对的Python初学者。这门免费、互动的课程提供和教授Python编程的基础
+此Codecademy课程面向绝对的Python初学者。这门免费、互动的课程提供和教授Python编程的基础
(和以后)的内容,同时测试用户之间知识的进展。
本课程还内置了一个解释器,用于获取学习过程中的即时反馈。
- `Learn to Program in Python with Codeacademy `_
+ `Computer Science Path on Codecademy `_
+Code the blocks
+~~~~~~~~~~~~~~~
+
+*Code the blocks* 为初学者提供免费的交互式Python教程。它将Python编程与3D环境相结合,
+您可以在其中“放置方块”并构建结构。本教程将教您如何使用Python创建逐渐精细的3D结构,
+从而使得学习Python的过程变得有趣和吸引人。
+
+ `Code the blocks `_
+
+
+************
中级
-------------
+************
+
+Python Tricks: The Book
+~~~~~~~~~~~~~~~~~~~~~~~
+
+通过简单的示例发现Python的最佳实践,并开始编写更美观的且Pythonic的代码。"Python Tricks: The Book"向您展示了具体方法。
+
+您将通过实际示例和清晰的叙述掌握Python的中级和高级功能:
+
+ `Python Tricks: The Book `_
Effective Python
~~~~~~~~~~~~~~~~
@@ -159,10 +192,11 @@ Effective Python
本书包含59种具体方法来改进编写Pythonic代码。在这227页中,这是一个关于程序员需要做的一些
最常见的程序以成为高效的中级Python程序员的非常简要的概述。
- `Effective Python `_
+ `Effective Python `_
+********
进阶者
---------
+********
Pro Python
~~~~~~~~~~
@@ -170,7 +204,7 @@ Pro Python
本书是面向从中级到高级,想明白Python是如何以及为何这样工作,如何将代码水平提高一级的
Python程序员。
- `Pro Python `_
+ `Pro Python `_
Expert Python Programming
@@ -184,7 +218,7 @@ Expert Python Programming讲解编写Python的最佳实践,并专注更高级
zc.buildout的一个章节。后面的章节详细讲述了最佳实践,比如编写文档、测试驱动开发、
版本控制、优化和分析。
- `Expert Python Programming `_
+ `Expert Python Programming `_
A Guide to Python's Magic Methods
@@ -195,12 +229,13 @@ A Guide to Python's Magic Methods
`A Guide to Python's Magic Methods `_
-.. note:: Rafekettler.com目前已关闭,您可以直接访问他们的Github版本。 在这里您可以找到一个PDF版本:
+.. note:: Rafekettler.com目前已关闭,您可以直接访问他们的GitHub版本。 在这里您可以找到一个PDF版本:
`A Guide to Python's Magic Methods (repo on GitHub) `_
-
+
+****************************
工程师和科学家
-----------------------------
+****************************
A Primer on Scientific Programming with Python
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -208,7 +243,7 @@ A Primer on Scientific Programming with Python
A Primer on Scientific Programming with Python 由 Hans Petter Langtangen编写,
主要涵盖了Python在科学领域的使用。在这本书中,例子是从数学和自然科学中选出的。
- `A Primer on Scientific Programming with Python `_
+ `A Primer on Scientific Programming with Python `_
Numerical Methods in Engineering with Python
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -216,10 +251,12 @@ Numerical Methods in Engineering with Python
Numerical Methods in Engineering with Python 由 Jaan Kiusalaas 编写,
其重点是数值方法以及如何用Python来实现。
- `Numerical Methods in Engineering with Python `_
+ `Numerical Methods in Engineering with Python `_
+
+********************
各种各样的话题
---------------------
+********************
Problem Solving with Algorithms and Data Structures
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -242,8 +279,8 @@ Programming Collective Intelligence介绍了大量基础的机器学习和数据
Transforming Code into Beautiful, Idiomatic Python
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Transforming Code into Beautiful, Idiomatic Python 是由 Raymond Hettinger制作的视频。
-通过它可以学习到更好地使用Python最佳特性,通过一系列的代码转换来改进现有代码,
+Transforming Code into Beautiful, Idiomatic Python 是由 Raymond Hettinger 制作的视频。
+通过它可以学习到更好地使用Python的最佳特性,通过一系列的代码转换来改进现有代码:
“当您看见这个,就那样去做”。
`Transforming Code into Beautiful, Idiomatic Python `_
@@ -260,8 +297,17 @@ Fullstack Python为使用Python进行Web开发提供了完整的自顶向下的
`Fullstack Python `_
+PythonistaCafe
+~~~~~~~~~~~~~~
+
+PythonistaCafe 是一个邀请式的在线社区,里面的 Python 和软件开发爱好者互帮互助、彼此成长。可以把它看做是 Pythonista 共同进行改进的俱乐部。在这里,每天都会讨论广泛的编程问题、职业建议,同时也会涉及其他主题。
+
+ `PythonistaCafe `_
+
+
+**********
参考
-----------
+**********
Python in a Nutshell
~~~~~~~~~~~~~~~~~~~~
@@ -309,6 +355,6 @@ Writing Idiomatic Python 由 Jeff Knupp 编写,包含了最常见和最重要
其形式尽可能地有辨识度和易于理解。每个习语都是编写一些常用代码片段的推荐方式,
其后会解释为什么这个习语是重要的。每个习语均有两个代码样例:“有害的”方式和“理想的”方式。
- `For Python 2.7.3+ `_
+ `For Python 2.7.3+ `_
- `For Python 3.3+ `_
+ `For Python 3.3+ `_
diff --git a/docs/intro/news.rst b/docs/intro/news.rst
index e4dfa36..6489bfa 100644
--- a/docs/intro/news.rst
+++ b/docs/intro/news.rst
@@ -1,66 +1,97 @@
+
+
+########
新闻
-====
+########
.. image:: https://farm4.staticflickr.com/3804/33573767786_eececc5d27_k_d.jpg
+
+****************
+PyCoder's Weekly
+****************
+
+PyCoder's Weekly 是一个面向 Python 开发者的免费的每周简讯,包括项目、文章、新闻和工作。
+
+ `PyCoder's Weekly `_
+
+
+***********
+Real Python
+***********
+
+在 Real Python 中,您可以通过每周免费且深入的教程从头开始学习 Python 的所有内容,
+包括 Python 最基础的知识,再到 Web 开发和 Web 爬取,再到数据可视化等等。
+
+ `Real Python `_
+
+
+*************
Planet Python
-~~~~~~~~~~~~~
+*************
这是一个聚合的,展示不断增长的开发者内容的Python新闻。
- `Planet Python `_
+ `Planet Python `_
+
+*********
/r/python
-~~~~~~~~~
+*********
/r/python是Reddit的Python社区,在这里用户会贡献和投票出和Python相关的新闻。
- `/r/python `_
+ `/r/python `_
+
+*******************
Talk Python Podcast
-~~~~~~~~~~~~~~~~~~~
+*******************
第一个关注 Python 的播客,涵盖了 Python 中的人和想法。
`Talk Python To Me `_
+
+********************
Python Bytes Podcast
-~~~~~~~~~~~~~~~~~~~~
+********************
一个简短的 Python 播客,涵盖了最近的开发人员头条。
`Python Bytes `_
-Pycoder's Weekly
-~~~~~~~~~~~~~~~~
-
-Pycoder's Weekly是一个面向Python开发者的免费的每周简讯,包括项目、文章、新闻和工作。
-
- `Pycoder's Weekly `_
+*************
Python Weekly
-~~~~~~~~~~~~~
+*************
Python Weekly是一个免费的每周简讯,其特色包括与Python相关的新闻、文章、新的发行版本、工作等。
- `Python Weekly `_
+ `Python Weekly `_
+
+***********
Python News
-~~~~~~~~~~~~~
+***********
Python News是Python官方网站的新闻章节。它简短突出来自Python社区的新闻。
- `Python News `_
+ `Python News `_
+
+********************
Import Python Weekly
-~~~~~~~~~~~~~~~~~~~~
+********************
Weekly Python Newsletter包含有Python文章、项目、视频、Tweets,并发送到您的收件箱。能够保持您的Python编程技能持续更新。
`Import Python Weekly Newsletter `_
+
+*************************
Awesome Python Newsletter
-~~~~~~~~~~~~~~~~~~~~~~~~~
+*************************
每周最流行的Python新闻、文章和包的概述。
diff --git a/docs/notes/contribute.rst b/docs/notes/contribute.rst
index 20ec9a8..92a87a6 100644
--- a/docs/notes/contribute.rst
+++ b/docs/notes/contribute.rst
@@ -1,7 +1,8 @@
+##########
贡献
-~~~~~~~~~~
+##########
-.. image:: https://farm3.staticflickr.com/2858/33573769116_49c1ef51e7_k_d.jpg
+.. image:: /_static/photos/33573769116_49c1ef51e7_k_d.jpg
Python-guide目前还在开发中,欢迎大家贡献代码。
@@ -10,20 +11,19 @@ Python-guide目前还在开发中,欢迎大家贡献代码。
`贡献者一览 `_ 中。
+***********
风格指南
------------
+***********
请戳这里 :ref:`guide-style-guide`.
.. _todo-list-ref:
+*********
要做的事
----------
+*********
-如果您想为我们做些贡献,这里有我们的计划。一个简短的 todo_ 列表。
+如果您想为我们做些贡献,请查看 GitHub_ 上的 issue 列表。
- .. include:: ../../TODO.rst
-
-.. _GitHub: http://github.com/kennethreitz/python-guide/
-.. _todo: https://github.com/kennethreitz/python-guide/blob/master/TODO.rst
+.. _GitHub: https://github.com/kennethreitz/python-guide/
diff --git a/docs/notes/license.rst b/docs/notes/license.rst
index cd3aca8..88f2a21 100644
--- a/docs/notes/license.rst
+++ b/docs/notes/license.rst
@@ -1,6 +1,6 @@
-=======
+#######
许可证
-=======
+#######
.. image:: https://farm4.staticflickr.com/3762/32800805573_568d6b72fd_k_d.jpg
diff --git a/docs/notes/styleguide.rst b/docs/notes/styleguide.rst
index 3cdb667..6af971e 100644
--- a/docs/notes/styleguide.rst
+++ b/docs/notes/styleguide.rst
@@ -1,8 +1,8 @@
.. _guide-style-guide:
-=====================
+#####################
风格指南指引
-=====================
+#####################
.. image:: https://farm4.staticflickr.com/3684/33573755856_7f43d43adf_k_d.jpg
@@ -14,20 +14,22 @@
.. note:: 在任何一个渲染后的HTML页面,您可以点击“查看源码(Show Source)”来看作者是如何排版的。
+*********
关联
----------
+*********
尽量保持任何贡献与 :ref:`本指南目的 ` 相关。
* 避免在主题中包含太多与Python开发并不直接相关的信息。
* 如果其他资源已存在,最好以链接的形式来展示。确保描述出您所链接的内容和原因。
-* `Cite `_
+* `Cite `_
引用在需要的地方。
* 如果某主题并不与Python直接相关,但是和Python之间的关联又很有用(比如Git、GitHub、数据库等),以链接的形式引用这些资源,并描述为什么它对Python有用。
* 如果疑问,就去询问。
+********
标题
---------
+********
使用下列风格作为标题。
@@ -43,37 +45,43 @@
.. code-block:: rest
- ===================
+ *******************
时间是种幻觉
- ===================
+ *******************
小节标题:
.. code-block:: rest
午餐时间加倍
- -------------------
+ ===================
次小节标题:
.. code-block:: rest
非常深
- ~~~~~~~~~
+ ---------
+
+*****
换行
------
+*****
每78个字符进行文字换行。必要时可以超过78个字符,尤其是那种换行使得源内容更难阅读的情况。
+使用标准的美式英语,而非英式英语。
+
`序列逗号(serial comma) `_
(也称为Oxford comma,牛津逗号)的使用是100%没有选择的。 任何尝试以缺少的连续逗号提交内容
将导致该项目的永久性移除,因为完全缺乏品味。
流放? 您在开玩笑吗? 希望我们永远不必找出来。
+
+*************
代码例子
--------------
+*************
所有代码示例要在70个字符进行换行,以避免出现水平滚动条。
@@ -86,7 +94,9 @@
$ run command --help
$ ls ..
-确保每行前面包含了 ``$`` 前缀。
+Unix 控制台用例中,确保每行前面包含了 ``$`` 前缀。
+
+Windows 控制台用例中,使用 ``doscon`` 或 ``powershell`` 而非 ``console``,并且去掉 ``$`` 前缀。
Python解释器例子:
@@ -109,8 +119,9 @@ Python 例子:
def get_answer():
return 42
+******************
外部链接
-------------------
+******************
* 链接时最好使用众所周知的主题(比如一些合适的名词):
@@ -118,21 +129,22 @@ Python 例子:
Sphinx_ 通常用来文档化Python。
- .. _Sphinx: http://sphinx.pocoo.org
+ .. _Sphinx: https://www.sphinx-doc.org
* 最好使用带有内联链接的描述性标签,而不是单纯的链接:
.. code-block:: rest
- 阅读 `Sphinx 教程 `_
+ 阅读 `Sphinx 教程 `_
* 避免使用诸如“点击这里”、“这个”等标签。最好使用描述性标签(值得搜索引擎优化,SEO worthy)。
+********************************
指向指南内部章节的链接
---------------------------------
+********************************
要交叉引用本文档的其他部分,使用 `:ref:
-`_ 关键字和标签。
+`_ 关键字和标签。
要使引用标签更加清晰和独特,通常加上一个 ``-ref`` 后缀:
@@ -143,10 +155,12 @@ Python 例子:
Some Section
------------
+
+******************
注意和警告
-------------------
+******************
-使用适当的 `警告指示 `_ 来说明注意内容。
+使用适当的 `警告指示 `_ 来说明注意内容。
注意:
@@ -163,14 +177,14 @@ Python 例子:
.. warning:: DON'T PANIC
+***************
要做的事
----------------
+***************
-请用 `todo 指示 `_ 来标记本指南中任何未完成的部分。避免使 :ref:`todo-list-ref` 混乱,为未完的文档或者大量未完的小节使用单独的 ``todo``。
+请用 `todo 指示 `_ 来标记本指南中任何未完成的部分。避免使 :ref:`todo-list-ref` 混乱,为未完的文档或者大量未完的小节使用单独的 ``todo``。
.. code-block:: rest
.. todo::
Learn the Ultimate Answer to the Ultimate Question
of Life, The Universe, and Everything
-
diff --git a/docs/scenarios/admin.rst b/docs/scenarios/admin.rst
index 0ed21bc..0486eac 100644
--- a/docs/scenarios/admin.rst
+++ b/docs/scenarios/admin.rst
@@ -1,10 +1,13 @@
+
+######################
系统管理
-======================
+######################
.. image:: https://farm5.staticflickr.com/4179/34435690580_3afec7d4cd_k_d.jpg
+******
Fabric
-------
+******
`Fabric `_ 是一个简化系统管理任务的库。
Chef和Puppet倾向于关注管理服务器和系统库,而Fabric更加关注应用级别的任务,比如说部署。
@@ -16,7 +19,7 @@ Chef和Puppet倾向于关注管理服务器和系统库,而Fabric更加关注
$ pip install fabric
下面的代码将会创建我们可以使用的两个任务: ``memory_usage`` 和 ``deploy``。
-前者将会在每台机器上输出内存使用情况。后者将会ssh到每台服务器,cd到我们的工程目录,
+前者将会在每台机器上输出内存使用情况。后者将会SSH到每台服务器,cd到我们的工程目录,
激活虚拟环境,拉取最新的代码库,以及重启应用服务器。
.. code-block:: python
@@ -65,8 +68,9 @@ and we can deploy with:
`Fabric 文档 `_
+****
Salt
-----
+****
`Salt `_ 是一个开源的基础管理工具。
它支持从中心节点(主要的主机)到多个主机(指从机)的远程命令执行。
@@ -116,8 +120,9 @@ Salt也提供状态系统。状态能够用来配置从机。
`Salt 文档 `_
+******
Psutil
-------
+******
`Psutil `_ 是获取不同系统信息
(比如CPU、内存、硬盘、网络、用户、进程)的接口。
@@ -133,45 +138,47 @@ Psutil
# 用于email服务的包:
import smtplib
import string
- MAX_NET_USAGE = 400000
+ MAX_NET_USAGE = 400000 # 每秒字节数
MAX_ATTACKS = 4
attack = 0
- counter = 0
while attack <= MAX_ATTACKS:
sleep(4)
- counter = counter + 1
- # Check the cpu usage
- if cpu_percent(interval = 1) > 70:
- attack = attack + 1
- # Check the net usage
- neti1 = net_io_counters()[1]
- neto1 = net_io_counters()[0]
+
+ # 使用命名元组检查网络使用情况
+ neti1 = net_io_counters().bytes_recv
+ neto1 = net_io_counters().bytes_sent
sleep(1)
- neti2 = net_io_counters()[1]
- neto2 = net_io_counters()[0]
- # Calculate the bytes per second
+ neti2 = net_io_counters().bytes_recv
+ neto2 = net_io_counters().bytes_sent
+
+ # 计算每秒字节数
net = ((neti2+neto2) - (neti1+neto1))/2
- if net > MAX_NET_USAGE:
- attack = attack + 1
- if counter > 25:
- attack = 0
- counter = 0
+
+ # 检查网络和cpu使用
+ if (net > MAX_NET_USAGE) or (cpu_percent(interval = 1) > 70):
+ attack+=1
+ elif attack > 1:
+ attack-=1
+
# 如果attack大于4,就编写一封十分重要的email
TO = "you@your_email.com"
FROM = "webmaster@your_domain.com"
SUBJECT = "Your domain is out of system resources!"
text = "Go and fix your server!"
- BODY = string.join(("From: %s" %FROM,"To: %s" %TO,"Subject: %s" %SUBJECT, "",text), "\r\n")
+ string="\r\n"
+ BODY = string.join(("From: %s" %FROM,"To: %s" %TO,
+ "Subject: %s" %SUBJECT, "",text))
server = smtplib.SMTP('127.0.0.1')
server.sendmail(FROM, [TO], BODY)
server.quit()
-一个类似于基于psutil并广泛扩展的top,并拥有客服端-服务端监控能力的完全终端应用叫做
-`glance `_ 。
+一个基于psutil,类似于top命令并广泛扩展的功能全面的终端应用程序叫做 `glance `_ ,它具备客户端-服务端监控能力。
+
+*******
Ansible
--------
+*******
`Ansible `_ 是一个开源系统自动化工具。
相比于Puppet或者Chef最大的优点是它不需要客户机上的代理。
@@ -218,8 +225,10 @@ Ansible playbook在 :file:`hosts.yml` 中将会ping所有的服务器。您也
`Ansible教程 `_ 也是一个很棒的且详细的指引来开始熟悉Ansible。
+****
Chef
-----
+****
+
`Chef `_ 是一个系统的云基础设施自动化框架,
它使部署服务器和应用到任何物理、虚拟或者云终端上变得简单。您可以选择进行配置管理,那将主要使用Ruby去编写您的基础设施代码。
@@ -243,8 +252,10 @@ Chef通过使用定制的在cookbook中实现的食谱(配置元素)来工
- `Chef 文档 `_
+
+******
Puppet
-------
+******
`Puppet `_ 是来自Puppet Labs的IT自动化和配置管理软件,允许系统管理员定义他们的IT基础设施状态,
这样就能够提供一种优雅的方式管理他们成群的物理和虚拟机器。
@@ -254,7 +265,7 @@ Puppet均可作为开源版和企业版获取到。其模块是小的、可共
Puppet代理安装于其状态需要被监控或者修改的节点上。作为特定服务器的Puppet Master负责组织代理节点。
-代理节点发送系统的基本信息到Puppet Master,比如说操作系统、内核、架构、ip地址、主机名等。
+代理节点发送系统的基本信息到Puppet Master,比如说操作系统、内核、架构、IP地址、主机名等。
接着,Puppet Master编译携带有节点生成信息的目录,告知每个节点应如何配置,并发送给代理。
代理便会执行前述目录中的变化,并向Puppet Master发送回一份报告。
@@ -322,22 +333,29 @@ Puppet有多种资源类型,需要时可以使用包-文件-服务(package-f
了解更多信息,参考 `Puppet Labs 文档 `_ 。
+
+*********
Blueprint
----------
+*********
.. todo:: Write about Blueprint
+********
Buildout
---------
+********
`Buildout `_ 是一个开源软件构件工具。Buildout由Python编写。
-它实现了配置和构建脚本分离的原则。Buildout主要用于下载和设置正在开发或部署软件的Python egg格式的依赖。
+它实现了配置和构建脚本分离的原则。Buildout主要用于下载和设置正在开发或部署软件的
+`Python eggs ` 格式的依赖。
在任何环境中构建任务的指南(recipe,原意为“食谱”,引申为“指南”)能被创建,许多早已可用。
+
+*******
Shinken
--------
+*******
-`Shinken `_ 是一个使用Python编写的现代化的兼容Nagios的监控框架。
-其主要目标是为用户的设计成可扩展到大型环境的监控系统提供灵活的框架。
+`Shinken `_ 是一个由 Python 编写的现代化、兼容 Nagios
+的监控框架。它的主要目标是为用户的监控系统提供灵活的架构,并且这个架构被设计为可扩展到大型环境。
-Shinken与Nagios配置标准和插件向后兼容。它适用于任何支持Python的操作系统和架构,包括Windows、GNU/Linux和FreeBSD。
\ No newline at end of file
+Shinken 向后兼容 Nagios 的配置标准和插件。它可以在任何支持 Python 的操作系统和架构上运行,
+包括 Windows、Linux 和 FreeBSD。
diff --git a/docs/scenarios/ci.rst b/docs/scenarios/ci.rst
index fa317c3..187f26f 100644
--- a/docs/scenarios/ci.rst
+++ b/docs/scenarios/ci.rst
@@ -1,10 +1,16 @@
+######################
持续集成
-======================
+######################
.. image:: https://farm5.staticflickr.com/4173/33907150594_9abba7ad0a_k_d.jpg
+.. note::
+ 关于编写测试更多的建议,参阅 :doc:`/writing/tests`。
+
+
+************
为什么?
-------------
+************
Martin Fowler 和 Kent Beck 首次提出 `Continuous Integration `_
(简称:CI),将之描述为:
@@ -14,23 +20,25 @@ Martin Fowler 和 Kent Beck 首次提出 `Continuous Integration `_ 可扩展的持续集成引擎。 使用它吧!
-
+********
Buildbot
---------
+********
`Buildbot `_ 是一个检查代码变化的自动化编译/
测试的Python系统。
-
+***
Tox
----
+***
`Tox `_ 是一款为Python软件提供打包、测试和
开发的自动化工具,基于命令行或CI服务器。它是一个通用的虚拟环境管理和测试的命令行
@@ -41,13 +49,13 @@ Tox
* 作为前端持续集成服务器,减少样板文件,合并了CI和基于shell的测试。
-
+*********
Travis-CI
----------
+*********
`Travis-CI `_ 是一个分布式CI服务器,免费为开源项目构建测试。
它提供多个worker运行Python测试,并能和GitHub无缝集成。您甚至可以用它对您的Pull Requests
-评论是否构建这个特定的变更集。Travis-ci是一个很好的、简单的方式去了解持续集成。
+评论是否构建这个特定的变更集。Travis-CI 是一个很好的、简单的方式去了解持续集成。
作为开始,将 :file:`.travis.yml` 文件加入到您的仓库中,内容如下::
@@ -65,9 +73,9 @@ Travis-CI
这将会使您的工程在罗列的Python版本中,用给定的脚本进行测试,而且只会构建主干分支。
-有许多可供开启的选项,包括通知、步骤前后等。 `Travis-ci docs `_
+有许多可供开启的选项,包括通知、步骤前后等。 `Travis-CI docs `_
详尽地解释了所有这些操作。
-为了激活您的工程的测试,去 `travis-ci 网站 `_ 登录您的GitHub
+为了激活您的工程的测试,去 `Travis-CI 网站 `_ 登录您的GitHub
账号。然后在您的profile设置中激活您的工程。现在,每一次push到GitHub上的提交将会运行
您的工程中的测试。
\ No newline at end of file
diff --git a/docs/scenarios/cli.rst b/docs/scenarios/cli.rst
index 4be89c4..1b0ada5 100644
--- a/docs/scenarios/cli.rst
+++ b/docs/scenarios/cli.rst
@@ -1,5 +1,7 @@
+
+#########################
命令行应用
-=========================
+#########################
.. image:: https://farm5.staticflickr.com/4272/34435690330_11930b5987_k_d.jpg
@@ -14,51 +16,61 @@
一些流行的命令行应用包括:
-* `Grep `_ - 一个纯文本数据搜索工具
+* `grep `_ - 一个纯文本数据搜索工具
* `curl `_ - 基于URL语法的数据传输工具
* `httpie `_ - 一个用户友好的命令行HTTP客户端,可以代替cURL
-* `git `_ - 一个分布式版本控制系统
-* `mercurial `_ - 一个主体是Python的分布式版本控制系统
-
-Clint
------
+* `Git `_ - 一个分布式版本控制系统
+* `Mercurial `_ - 一个主体是Python的分布式版本控制系统
-`clint `_ 是一个Python模块,它包含了很多
-对命令行应用开发有用的工具。它支持诸如CLI着色以及缩进,简洁而强大的列打印,
-基于进度条的迭代以及参数控制的特性。
+*****
Click
------
+*****
+
+`click `_ 是一个以尽可能少的代码,用组合方式创建命令行接口的Python包。
+命令行接口创建工具(“Command-Line Interface Creation Kit”, Click)高度可配置,但也有开箱即用的默认值设置。
-`click `_ 是一个以尽可能少的代码,用组合方式创建命令行接口的Python包。
-命令行接口创建工具(“Command-line Interface Creation Kit”, Click)高度可配置,但也有开箱即用的默认值设置。
+******
docopt
-------
+******
`docopt `_ 是一个轻量级,高度Pythonic风格的包,它支持
简单而直觉地创建命令行接口,它是通过解析POSIX-style的用法指示文本实现的。
+
+****
Plac
-------
+****
+
+`Plac `_ 是对 Python 标准库
+`argparse `_ 的简单封装。
+它使用声明式接口隐藏其复杂性:参数解析器是被推断出来,而非强制编写。
+此模块面向不熟练的用户、程序员、系统管理员、科学家以及只想
+写个只一次性脚本的人们。他们选择创建命令行界面,因为它快速而简单。
-`Plac `_ Python标准库
-`argparse `_ 的简单封装,
-它隐藏了大量声明接口的细节:参数解析器是被推断的,其优于写命令明确处理。
-这个模块的面向是不想太复杂的用户,程序员,系统管理员,科学家以及只是想
-写个只运行一次的脚本的人们,使用这个命令行接口的理由是它可以快速实现并且简单。
+*****
Cliff
-------
+*****
`Cliff `_ 是一个建立命令行程序的框架。
它使用setuptools入口点(entry points)来提供子命令,输出格式化,以及其他的扩展。这个框架
-可以用来创建多层命令程序,如subversion与git,其主程序要进行一些简单的参数解析然后调用
+可以用来创建多层命令程序,如 ``svn`` 和 ``git``,其主程序要进行一些简单的参数解析然后调用
一个子命令干活。
+
+******
Cement
-------
+******
`Cement `_ 是一个高级的CLI应用程序框架。
其目标是为简单和复杂的命令行应用程序引入标准和功能完整的平台,并支持快速开发需求,而不会牺牲质量。
-Cement是灵活的,它的用例范围涵盖了从微框架的简单到巨型框架的复杂。
\ No newline at end of file
+Cement是灵活的,它的用例范围涵盖了从微框架的简单到巨型框架的复杂。
+
+
+***********
+Python Fire
+***********
+
+`Python Fire `_ 是一个能根据任意 Python 对象自动生成出命令行接口的库。它能帮助您更轻松地通过命令行调试 Python 代码,根据现有代码创建命令行接口,还能让您以在 REPL 中交互式地浏览 Python 对象,并简化 Python 和 Bash(或任何其他 Shell)之间的转换。
diff --git a/docs/scenarios/clibs.rst b/docs/scenarios/clibs.rst
index 3000453..6e06fd2 100644
--- a/docs/scenarios/clibs.rst
+++ b/docs/scenarios/clibs.rst
@@ -1,14 +1,21 @@
+
+################################
与C/C++库交互
-================================
+################################
.. image:: https://farm5.staticflickr.com/4173/34725951345_c8f5959a2e_k_d.jpg
-C语言外部函数接口(CFFI)
-----------------------------
-`CFFI `_ 通过CPython和PyPy给出了和
-C语言交互的简单使用机制。它支持两种模式:一种是内联的ABI兼容模式(示例如下),
-它允许您动态加载和运行可执行模块的函数(本质上与LoadLibrary和dlopen拥有相同的功能);
+############################
+C语言外部函数接口(CFFI)
+############################
+
+`CFFI `_ 通过 CPython 和 PyPy 给出了和
+C语言交互的简单使用机制。它支持两种模式:一种是内联的
+`ABI `_
+兼容模式(示例如下),它允许您动态加载和运行可执行模块的函数(本质上与
+`LoadLibrary `_ 或
+`dlopen `_ 拥有相同的功能);
另一种为API模式,它允许您构建C语言扩展模块。
ABI 交互
@@ -25,11 +32,13 @@ ABI 交互
# prints: 23
print("{}".format(length))
+
+******
ctypes
-------
+******
`ctypes `_ 是CPython中与C/C++
-交互的事实上的库。它不仅能完全访问大多数主流操作系统(比如:Windows上的Kernel32,
+交互的事实上的标准库。它不仅能完全访问大多数主流操作系统(比如:Windows上的Kernel32,
\*nix上的libc)的纯C接口,并且支持对动态库的加载和交互,如DLL和运行时共享对象。
它同时涵盖许多可和系统API交互的类型,并允许您以相对简单的方式定义自己的复杂类型,
如struct和union,并在需要时允许您作出如填充、对齐这样的修改。对它的使用可能稍显复杂,
@@ -59,8 +68,10 @@ Struct Equivalents
_fields_ = [("a", c_int),
("b", c_int)]
+
+****
SWIG
-----
+****
`SWIG `_ 并不仅仅应用于Python(它支持多种脚本语言),
它是生成解释性语言和C/C++头文件绑定的工具。它极易使用:使用者只需简单的定义接口文件
@@ -110,8 +121,9 @@ SWIG
%include "MyClass.h"
+************
Boost.Python
-------------
+************
`Boost.Python `_
需要一些手动工作来展现C++对象的功能,但它可提供SWIG拥有的所有特性。同时,
diff --git a/docs/scenarios/client.rst b/docs/scenarios/client.rst
index e513fb7..d9ac9d9 100644
--- a/docs/scenarios/client.rst
+++ b/docs/scenarios/client.rst
@@ -1,36 +1,41 @@
+
+####################
网络应用
-====================
+####################
.. image:: https://farm5.staticflickr.com/4251/34364815780_bea6614025_k_d.jpg
+
+****
HTTP
-::::
+****
超文本传输协议(HTTP)是为分布式的、协同的多媒体信息系统而设计的应用协议,是万维网数据传输的基础。
Requests
---------
+~~~~~~~~
Python的urllib2标准模块涵盖了所需的大多数HTTP功能,但它的API却是支离破碎的。它构建在一个和现今完全不同的时期——以及为了一个不一样的网络。一个简单的任务便需要耗费它大量的工作(即使重写函数也无济于事)。
Requests将所有Python HTTP相关的功能剥离了出来,并与网络服务无缝衔接。Requests无需再在URL中添加查询语句或格式编码的POST数据。而集成在Requests中urllib3,则实现了持久连接和HTTP连接池的完全自动化。
-- `文档 `_
-- `PyPi `_
+- `文档 `_
+- `PyPI http://pypi.org/project/requests>`_
- `GitHub `_
+********************
分布式系统
-::::::::::::::::::::
+********************
ZeroMQ
-------
+~~~~~~
ØMQ(也被称作ZeroMQ, 0MQ 或 ZMQ)是一种高性能异步消息传递库,旨在应用于可扩展分布的或并发的应用。它提供一个消息队列,但与面向消息的中间件不同,ØMQ系统可在不依赖专用消息代理的情况下运行。ØMQ旨在设计成为类似于socket风格的API。
RabbitMQ
---------
+~~~~~~~~
RabbitMQ是一种使用了高级消息队列协议(AMQP)的开源消息代理软件。RabbitMQ服务由Erlang编程语言写成,并构建在开放电信平台框架上,应用于集群和故障转移。与该代理交互的客户端库支持所有主流编程语言。
diff --git a/docs/scenarios/crypto.rst b/docs/scenarios/crypto.rst
index e34c670..85d7c93 100644
--- a/docs/scenarios/crypto.rst
+++ b/docs/scenarios/crypto.rst
@@ -1,15 +1,19 @@
+
+############
密码学
-============
+############
.. image:: https://farm5.staticflickr.com/4220/33907152824_bf91078cc1_k_d.jpg
-Cryptography
-------------
-`Cryptography `_ 是一个开发活跃的库,它提供
+************
+cryptography
+************
+
+`cryptography `_ 是一个开发活跃的库,它提供
了加密方法(recipes)和基元(primitives),支持Python 2.6-2.7、Python 3.3+ 和 PyPy。
-Cryptography 分为两个层,方法(recipes)层和危险底层(hazardous materials,简称hazmat)。
+cryptography 分为两个层,方法(recipes)层和危险底层(hazardous materials,简称hazmat)。
方法层提供用于适当的对称加密,hazmat层提供底层的加密基元。
安装
@@ -33,30 +37,49 @@ Cryptography 分为两个层,方法(recipes)层和危险底层(hazardous
plain_text = cipher_suite.decrypt(cipher_text)
+**************
+GPGME bindings
+**************
-PyCrypto
---------
+`GPGME Python bindings `_ 提供Pythonic的方式访问 `GPG Made Easy `_ ,这是整个GNU Privacy Guard项目套件,包括GPG、libgcrypt和gpgsm(S/MIME 引擎),的C API。它支持Python 2.6、2.7、3.4及以上版本。取决于Python的SWIG C接口以及GnuPG软件和库。
-`PyCrypto `_ 是另一个密码库,它提供
-安全的哈希函数和各种加密算法,支持Python 2.1到3.3。
+这里有更全面的GPGME Python Bindings HOWTO的 `源码版 `_ 和 `HTML版 `_。还提供了Python 3版本的HOWTO示例脚本的源代码,并且可以在 `这里 `_ 访问。
+
+其在与GnuPG其余项目的相同条款(GPLv2和LGPLv2.1,均带有“或更高版本”)下可用。
安装
~~~~~~~~~~~~
-.. code-block:: console
-
- $ pip install pycrypto
+如果配置脚本定位到了所支持的python版本(配置时位于$PATH中),那么在编译GPGME时会默认包含它。
例子
~~~~~~~
-.. code-block:: python
-
- from Crypto.Cipher import AES
- # Encryption
- encryption_suite = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')
- cipher_text = encryption_suite.encrypt("A really secret message. Not for prying eyes.")
-
- # Decryption
- decryption_suite = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')
- plain_text = decryption_suite.decrypt(cipher_text)
+.. code-block:: python3
+
+ import gpg
+
+ # Encryption to public key specified in rkey.
+ a_key = input("Enter the fingerprint or key ID to encrypt to: ")
+ filename = input("Enter the filename to encrypt: ")
+ with open(filename, "rb") as afile:
+ text = afile.read()
+ c = gpg.core.Context(armor=True)
+ rkey = list(c.keylist(pattern=a_key, secret=False))
+ ciphertext, result, sign_result = c.encrypt(text, recipients=rkey,
+ always_trust=True,
+ add_encrypt_to=True)
+ with open("{0}.asc".format(filename), "wb") as bfile:
+ bfile.write(ciphertext)
+ # Decryption with corresponding secret key
+ # invokes gpg-agent and pinentry.
+ with open("{0}.asc".format(filename), "rb") as cfile:
+ plaintext, result, verify_result = gpg.Context().decrypt(cfile)
+ with open("new-{0}".format(filename), "wb") as dfile:
+ dfile.write(plaintext)
+ # Matching the data.
+ # Also running a diff on filename and the new filename should match.
+ if text == plaintext:
+ print("Hang on ... did you say *all* of GnuPG? Yep.")
+ else:
+ pass
diff --git a/docs/scenarios/db.rst b/docs/scenarios/db.rst
index c9281fc..ac79194 100644
--- a/docs/scenarios/db.rst
+++ b/docs/scenarios/db.rst
@@ -1,13 +1,17 @@
+
+#########
数据库
-=========
+#########
.. image:: https://farm5.staticflickr.com/4225/33907152464_a99fdcc8de_k_d.jpg
+
+******
DB-API
-------
+******
Python数据库API(DB-API)定义了一个Python数据库访问模块的标准接口。它的文档在 :pep:`249` 可以查看。
-几乎所有Python数据库模块,诸如 `sqlite3`, `psycopg` 以及 `mysql-python` 都遵循这个接口。
+几乎所有Python数据库模块,诸如 `sqlite3`、 `psycopg` 以及 `mysql-python` 都遵循这个接口。
关于如何与遵守这一接口的模块交互的教程可以在这里找到:
@@ -15,8 +19,10 @@ Python数据库API(DB-API)定义了一个Python数据库访问模块的标
`这里 `__ 。
+
+**********
SQLAlchemy
-----------
+**********
`SQLAlchemy `_ 是一个流行的数据库工具。不像很多
数据库库,它不仅提供一个ORM层,而且还有一个通用API来编写避免SQL的数据库无关代码。
@@ -25,8 +31,10 @@ SQLAlchemy
$ pip install sqlalchemy
+
+*******
Records
--------
+*******
`Records `_ 是极简SQL库,旨在将原始SQL查询发送到各种数据库。
数据可以以编程方式使用,也可以导出到一些有用的数据格式。
@@ -37,44 +45,62 @@ Records
还包括用于导出SQL数据的命令行工具。
+
+******
+PugSQL
+******
+
+`PugSQL `_ 是一个简单的用于组织和使用参数化手写SQL的Python接口,。
+它是一个低保真哲学的反ORM,但仍在Python中提供了一个简洁的接口。
+
+.. code-block:: console
+
+ $ pip install pugsql
+
+
+**********
Django ORM
-----------
+**********
-Django ORM 是 `Django `_ 用来进行数据库访问的接口。
+Django ORM 是 `Django `_ 用来进行数据库访问的接口。
它的思想建立在 `models `_ ,
之上。这是一个致力于简化Python中数据操作的抽象层。
基础:
-- 每个model是django.db.models.Model的子类。
-- model的每个属性表示数据库的域(field)。
+- 每个model是django.db.models.Model的子类
+- model的每个属性表示数据库的域(field)
- Django给您一个自动生成的数据库访问API,参见
- `Making queries `__。
+ `Making queries `__
+
+******
peewee
-------
+******
`peewee `_ 是另一个ORM,它致力于轻量级和支持Python2.6+与3.2+默认支持的
-SQLite,MySQL以及Postgres。 `model layer `_
+SQLite、MySQL以及PostgreSQL。 `model layer `_
与Django ORM类似并且它拥有 `SQL-like methods `_
-来查询数据。除了将SQLite,MySQL以及Postgres变为开箱即用,还有进一步的扩展功能可以在这里找到:
+来查询数据。除了将SQLite、MySQL以及PostgreSQL变为开箱即用,还有进一步的扩展功能可以在这里找到:
`collection of add-ons `_。
+
+*******
PonyORM
--------
+*******
`PonyORM `_ 是一个ORM,它使用与众不同的方法查询数据库,有别于
使用类似SQL的语言或者布尔表达式,它使用Python的生成器达到目的。而且还有一个图形化
-schema编辑器生成PonyORM实体。它支持Python2.6+与3.3+并且可以连接SQLite,MySQL,Postgres与Oracle。
-
+schema编辑器生成PonyORM实体。它支持Python2.6+与3.3+并且可以连接SQLite、MySQL、PostgreSQL与Oracle。
+*********
SQLObject
----------
+*********
`SQLObject `_ 是另一个ORM。它支持广泛的数据库,常见的
-MySQL,Postgres以及SQLite与更多的特别系统如SAP DB,SyBase与MSSQL。它只支持Python 2
+MySQL、PostgreSQL以及SQLite与更多的特别系统如SAP DB、SyBase与MSSQL。它只支持Python 2
.. There's no official information on this on their page, this information was gathered by looking at their source code
diff --git a/docs/scenarios/gui.rst b/docs/scenarios/gui.rst
index 4bb37f6..0848a32 100644
--- a/docs/scenarios/gui.rst
+++ b/docs/scenarios/gui.rst
@@ -1,91 +1,146 @@
+
+################
GUI应用
-================
+################
.. image:: https://farm5.staticflickr.com/4250/33907143624_cd621b535c_k_d.jpg
以下GUI应用按字母顺序排列。
+
+*******
Camelot
--------
-除了Python,SQLAlchemy和Qt之外,`Camelot `_
+*******
+
+除了Python、SQLAlchemy和Qt之外,`Camelot `_
提供构建应用的组件。它的灵感取决于Django的管理接口。
如下是主要的信息资源网站: http://www.python-camelot.com
-,邮件列表网站: http://groups.google.com/forum/#!forum/project-camelot
+,邮件列表网站: http://groups.google.com/forum/#!forum/project-camelot 。
+
+*****
Cocoa
------
+*****
+
.. note:: Cocoa框架仅在OS X中可用。如果您正在写一个跨平台的应用,不要选用这个!
+
+***
GTk
----
-PyGTK提供GTK+工具包的Python绑定。和GTK+库一样,PyGTK当前由GNU LGPL授权。
-PyGTK当前只支持Gtk-2.X的API(Gtk-3.0不支持)。值得一提的是,PyGTK不适用于新项目,
-而已经存在的应用不能从PyGTK移植到PyGObject。
+***
+
+.. note:: PyGTK提供GTK+工具包的Python绑定。但是,它已被PyGObject取代。 PyGTK不应该用于新项目,现有项目应该移植到PyGObject。
+
+********************
PyGObject aka (PyGi)
---------------------
+********************
+
`PyGObject `_ 提供了Python绑定,可以访问整个GNOME软件平台。
它完全兼容GTK+ 3。使用“Python GTK+ 3 教程”(https://python-gtk-3-tutorial.readthedocs.io/en/latest/>`_)
来开始学习。
`API 参考 `_
+
+****
Kivy
-----
+****
+
`Kivy `_ 是一个Python库,该库用于开发多点触控的媒体应用。
当代码需要重复利用并且可部署时,它能够实现快速简单的交互设计,并且加速成形。
Kivy使用Python编写,并且基于OpenGL,除此,它支持不同的输入设备,
例如鼠标、双鼠标、WiiMote、WM_TOUCH、HIDtouch和苹果的产品等等。
-Kivy由社区积极开发,并且免费使用。它适用于所有主要的平台(Linux,OSX, Windows, Android)
+Kivy由社区积极开发,并且免费使用。它适用于所有主要的平台(Linux,OS X, Windows, Android)
如下是主要的信息资源网站: http://kivy.org
+
+******
PyObjC
-------
+******
+
.. note:: 仅在OS X中可用。如果您正在写一个跨平台的应用,不要选用这个。
+
+******
PySide
-------
+******
+
PySide是跨平台的Qt GUI工具包的Python绑定。
+它的包名取决于主要的 Qt 版本(`PySide` 用于 Qt4,`PySide2` 用于 Qt5,`PySide6` 用于 Qt6)。
+这组绑定由 `Qt 公司 `_ 开发。
+
+.. code-block:: console
+
+ $ pip install pyside6
- pip install pyside
+https://pyside.org
-https://wiki.qt.io/Category:LanguageBindings::PySide::Downloads
+****
PyQt
-----
+****
+
.. note:: 如果软件不能完全遵循GPL,那么就需要商业许可证。
PyQt提供Qt框架的Python绑定(见如下)
http://www.riverbankcomputing.co.uk/software/pyqt/download
-PyjamasDesktop (pyjs Desktop)
------------------------------
-PyjamasDesktop是Pyjamas的端口。PyjamasDesktop是桌面应用工具集,并且是跨平台框架
-(在发布的v0.6版本之后,PyjamasDesktop是Pyjamas (Pyjs)的一部分)。简而言之,
-它允许完全一样的Python网页应用资源代码能够如独立的桌面应用执行。
+
+***************************************
+Pyjs Desktop (formerly Pyjamas Desktop)
+***************************************
+
+Pyjs Desktop 是一个用于桌面和跨平台框架的应用程序小部件集。
+它允许完全相同的 Python Web 应用程序源代码作为独立的桌面应用程序来执行。
`PyjamasDesktop的Python维基百科 `_.
-主要的网址: `pyjs Desktop `_.
+主要的网址: `pyjs `_。
+
+**
Qt
---
+**
+
`Qt `_ 是跨平台应用框架,它被广泛用于借GUI开发软件,但是也可用于非GUI应用。
+
+***********
+PySimpleGUI
+***********
+
+`PySimpleGUI `_ 是 Tkinter 一层包装。
+使用 PySimpleGUI 实现自定义 GUI 所需的代码量要比使用 Tkinter 直接编写相同的 GUI 要少得多。
+使用 Tkinter 作为底层是因为它与其他 GUI 框架相比,能运行在更多的平台上。
+
+.. code-block:: console
+
+ $ pip install pysimplegui
+
+PySimpleGUI 完全包含在一个 PySimpleGUI.py 文件中。
+如果 pip 安装不可用,将 PySimpleGUI.py 粘贴到项目文件夹中以便引用,即可。
+
+
+****
Toga
-----
+****
+
`Toga `_ 是一个原生Python和操作系统的
跨平台GUI工具包。Toga由一个具有共享接口的基础组件库组成,以简化与平台无关的GUI开发。
Toga适用于Mac OS、Windows、Linux(GTK)以及Android和iOS等移动平台。
+
+**
Tk
---
+**
+
Tkinter是Tcl/Tk上的面向对象层。 **它的优势是包括Python标准库,能够使编程更加方便,兼容性更强。**
不管是Tk还是Tkinter,在大多数Unix平台,以及Windows和Macintosh系统都可用。
@@ -94,10 +149,13 @@ Tkinter是Tcl/Tk上的面向对象层。 **它的优势是包括Python标准库
在 `TkDocs `_ 中有一个非常好的多语言Tk教程,
所有例子使用Python。更多信息可以看 `Python 维基百科 `_.
+
+********
wxPython
---------
+********
+
wxPython是Python语言编写的GUI工具包。Python编写人员能够使简单容易地使用健壮,高功能的图形用户接口编程。
把流行的wxWidgets包在跨平台GUI库中,从而作为Python的扩展模块,这用C++编写。
**安装(稳定版)wxPython可以去如下网址**
-http://www.wxpython.org/download.php#stable ,并且下载适用于当前操作系统的安装包。
+https://www.wxpython.org/pages/downloads/ ,并且下载适用于当前操作系统的安装包。
diff --git a/docs/scenarios/imaging.rst b/docs/scenarios/imaging.rst
index 4d95946..40ba310 100644
--- a/docs/scenarios/imaging.rst
+++ b/docs/scenarios/imaging.rst
@@ -1,6 +1,6 @@
-==================
+##################
图像处理
-==================
+##################
.. image:: https://farm5.staticflickr.com/4157/34575689432_3de8e9a348_k_d.jpg
@@ -9,14 +9,16 @@ OpenSource Computer Vision (OpenCV)。
下面是这两个库的简略介绍。
+
+**********************
Python 图形库
-----------------------
+**********************
+
+`Python Imaging Library `_ ,或者叫PIL,简略来说,
+是Python图像操作的核心库。不幸的是,它的开发陷入了停滞,最后一次更新是2009年。
- `Python Imaging Library `_ ,或者叫PIL,简略来说,
- 是Python图像操作的核心库。不幸的是,它的开发陷入了停滞,最后一次更新是2009年。
-
- 对您而言幸运的是,存在一个活跃的PIL开发分支,叫做 `Pillow `_
- 它很容易安装,运行在各个操作系统上,而且支持Python3。
+对您而言幸运的是,存在一个活跃的PIL开发分支,叫做 `Pillow `_
+它很容易安装,运行在虽有的主流操作系统上,而且支持Python3。
安装
~~~~~~~~~~~~
@@ -59,8 +61,9 @@ Python 图形库
`Pillow 教程 `_。
+**************************
开源计算机视觉(OpenCv)
---------------------------
+**************************
OpenSource Computer Vision,其更广为人知的名字是OpenCv,是一个在图像操作与处理上
比PIL更先进的库。它可以在很多语言上被执行并被广泛使用。
@@ -84,8 +87,7 @@ NumPy可以从Python Package Index (PyPI)中下载:
.. code-block:: python
- from cv2 import *
- import numpy as np
+ import cv2
#读取图像
img = cv2.imread('testimg.jpg')
#显示图像
diff --git a/docs/scenarios/json.rst b/docs/scenarios/json.rst
index 59ab161..0edb045 100644
--- a/docs/scenarios/json.rst
+++ b/docs/scenarios/json.rst
@@ -1,13 +1,17 @@
+
+####
JSON
-====
+####
.. image:: https://farm5.staticflickr.com/4174/33928819683_97b5c6a184_k_d.jpg
-`json `_ 库可以自字符串或文件中解析JSON。
+`json `_ 库可以自字符串或文件中解析JSON。
该库解析JSON后将其转为Python字典或者列表。它也可以转换Python字典或列表为JSON字符串。
+
+************
解析JSON
-------------
+************
创建下面包含JSON数据的字符串
@@ -41,20 +45,3 @@ JSON
print(json.dumps(d))
'{"first_name": "Guido", "last_name": "Rossum", "titles": ["BDFL", "Developer"]}'
-
-
-simplejson
-----------
-
-JSON库是Python2.6版中加入的。如果您使用更早版本的Python,
-可以通过PyPI获取 `simplejson `_ 库。
-
-simplejson类似json标准库,它使得使用老版本Python的开发者们可以使用json库中的最新特性。
-
-如果json库不可用,您可以将simplejson取别名为json来使用:
-
-.. code-block:: python
-
- import simplejson as json
-
-在将simplejson当成json导入后,上面的例子会像您在使用标准json库一样正常运行。
\ No newline at end of file
diff --git a/docs/scenarios/ml.rst b/docs/scenarios/ml.rst
index 6a5e78f..e5caf4e 100644
--- a/docs/scenarios/ml.rst
+++ b/docs/scenarios/ml.rst
@@ -1,6 +1,7 @@
-================
+
+################
机器学习
-================
+################
.. image:: https://farm4.staticflickr.com/3954/34018729885_002ced9b54_k_d.jpg
@@ -8,11 +9,13 @@ Python拥有大量的数据分析、统计和机器学习库,使其成为许
一些广泛使用的机器学习和其他数据科学应用程序包被列在下面:
-Scipy 栈(Scipy stack)
----------------------------------
-Scipy 栈由数据科学所使用的一组核心帮助包组成,用于统计分析和数据可视化。
-由于其庞大的功能和易用性,scripy栈被认为是大多数数据科学应用的必备条件。
+*********************************
+SciPy 栈(SciPy stack)
+*********************************
+
+SciPy 栈由数据科学所使用的一组核心帮助包组成,用于统计分析和数据可视化。
+由于其庞大的功能和易用性,SciPy 栈被认为是大多数数据科学应用的必备条件。
该栈包含以下包(提供文档链接):
@@ -35,8 +38,10 @@ Scipy 栈由数据科学所使用的一组核心帮助包组成,用于统计
**注意:** `Anaconda `_ 是高推荐的,
因为它可以无缝地安装和维护数据科学包。
+
+************
scikit-learn
-------------
+************
Scikit是一个用于Python的免费开源机器学习库。 它提供了现成的功能来实现诸如线性回归、
分类器、SVM、k-均值和神经网络等多种算法。它还有一些可直接用于训练和测试的样本数据集。
diff --git a/docs/scenarios/network.rst b/docs/scenarios/network.rst
index c29c33b..f578c20 100644
--- a/docs/scenarios/network.rst
+++ b/docs/scenarios/network.rst
@@ -1,20 +1,25 @@
+
+##########
网络
-==========
+##########
+
+.. image:: /_static/photos/34151833832_6bdfd930af_k_d.jpg
-.. image:: https://farm3.staticflickr.com/2892/34151833832_6bdfd930af_k_d.jpg
+*******
Twisted
--------
+*******
-`Twisted `_ 是一款基于事件驱动的网络引擎框架。
-支持创建基于不同网络协议的应用,包括 http 服务器与客户端,SMTP 应用,POP3,IMAP
-或 SSH 协议,即时通讯 `等等 `_。
+`Twisted `_ 是一款基于事件驱动的网络引擎框架。
+支持创建基于不同网络协议的应用,包括 HTTP 服务器与客户端、SMTP 应用、POP3、IMAP
+或 SSH 协议,即时通讯 `等等 `_。
+*****
PyZMQ
------
+*****
-`PyZMQ `_ 是 `ZeroMQ `_
+`PyZMQ `_ 是 `ZeroMQ `_
的 Python捆绑库 (binding),ZeroMQ 是一款高效率的异步消息库,它的一个显著优点就是能
被用做消息队列且不需要消息代理。基本模式包括:
@@ -27,8 +32,10 @@ PyZMQ
想要快速入门,阅读 `ZeroMQ 指南 `_.
+
+******
gevent
-------
+******
`gevent `_ 是一款基于协程的Python 网络库,它使用 greenlets
提供在 libev 事件循环之上的高层次异步API。
\ No newline at end of file
diff --git a/docs/scenarios/scientific.rst b/docs/scenarios/scientific.rst
index 376a694..5b419ec 100644
--- a/docs/scenarios/scientific.rst
+++ b/docs/scenarios/scientific.rst
@@ -1,11 +1,14 @@
-=======================
+
+#######################
科学应用
-=======================
+#######################
+
+.. image:: /_static/photos/33925223870_97e44f5629_k_d.jpg
-.. image:: https://farm3.staticflickr.com/2890/33925223870_97e44f5629_k_d.jpg
+*******
背景
-:::::::
+*******
Python被经常使用在高性能科学应用中。它之所以在学术和科研项目中得到
@@ -13,17 +16,18 @@ Python被经常使用在高性能科学应用中。它之所以在学术和科
由于科学计算对高性能的要求,Python中相关操作经常借用外部库,通常是
-以更快的语言(如C,或者FORTRAN来进行矩阵操作)写的。其主要的库有 `Numpy`_,
-`Scipy`_ 以及 `Matplotlib`_。关于这些库的细节超出了本指南的范围。不过,
+以更快的语言(如C,或者Fortran来进行矩阵操作)写的。其主要的库有 `Numpy`_,
+`SciPy`_ 以及 `Matplotlib`_。关于这些库的细节超出了本指南的范围。不过,
关于Python的科学计算生态的综合介绍可以在这里找到
`Python Scientific Lecture Notes `_。
+*****
工具
-:::::
+*****
IPython
--------
+~~~~~~~
`IPython `_ 是一个加强版Python解释器,它提供了科学工作者
@@ -35,13 +39,14 @@ python 笔记本。这个笔记本允许您保存一些代码块,伴随着它
注释(HTML,LaTex,Markdown)。这个笔记本可以被共享并以各种文件格式导出。
+*****
库
-:::::::::
+*****
NumPy
------
+~~~~~
-`NumPy `_ 是一个用C和FORTRAN写的底层库,它提供一些高层
+`NumPy `_ 是一个用C和Fortran写的底层库,它提供一些高层
数学函数。NumPy通过多维数组和操作这些数组的函数巧妙地解决了Python运行算法较慢的问题。
任何算法只要被写成数组中的函数,就可以运行得很快。
@@ -51,21 +56,21 @@ NumPy是SciPy项目中的一部分,它被发布为一个独立的库,这样
NumPy兼容Python 2.4-2.7.2以及3.1+。
Numba
------
+~~~~~
`Numba `_ 是一个针对NumPy的Python编译器(即时编译器,JIT)
它通过特殊的装饰器,将标注过的Python(以及NumPy)代码编译到LLVM(Low Level Virtual Machine,底层虚拟机)中。简单地说,Python使用一种机制,用LLVM将Python代码编译为
能够在运行时执行的本地代码。
SciPy
------
+~~~~~
`SciPy `_ 是基于NumPy并提供了更多的数学函数的库。
SciPy使用NumPy数组作为基本数据结构,并提供完成各种常见科学编程任务的模块,
包括线性代数,积分(微积分),常微分方程求解以及信号过程。
Matplotlib
-----------
+~~~~~~~~~~
`Matplotlib `_ 是一个可以灵活绘图的库,它
能够创建2D、3D交互式图形,并能保存成具有稿件质量(manuscript-quality)的图表。
@@ -73,52 +78,60 @@ Matplotlib
很容易转移到Python。在 `matplotlib gallery `_ 中可以找到很多例子以及实现它们的源代码(可以在此基础上再创造)。
Pandas
-------
+~~~~~~
`Pandas `_ 是一个基于NumPy的数据处理库,它提供了
许多有用的函数能轻松地对数据进行访问、索引、合并以及归类。其主要数据结构(DataFrame)
与R统计学包十分相近;也就是,使用名称索引的异构数据(heterogeneous data)表、时间序列操作以及对数据的自动对准(auto-alignment)。
+xarray
+~~~~~~
+
+`xarray `_ 和 Pandas 类似,但是为包装多维科学数据而生。
+通过给数据标记维度、坐标和属性使得多维操作变得更加清晰和直观。它还包装了matplotlib以快速绘图,还可以通过
+`dask `_ 来并行地进行大多数的操作。
+
Rpy2
-----
+~~~~
`Rpy2 `_ 是一个对R统计学包的Python绑定,
它能够让Python执行R函数,并在两个环境中交换数据。Rpy2是
对 `Rpy `_ 绑定的面向对象实现。
PsychoPy
---------
+~~~~~~~~
`PsychoPy `_ 是面向认知科学家的库,它允许创建
认知心理学和神经科学实验(译者注:指的是那种您坐在电脑前,给您一个刺激测
您反应的实验,基本上就是个UI)。这个库能够处理刺激表示、实验设计脚本以及
数据收集。
+
+*********
资源
-:::::::::
+*********
安装这些科学计算Python包可能会有些麻烦,因为它们中很多是用Python的C扩展实现的,
这就意味着需要编译。这一节列举了各种科学计算Python发行版,它们提供了预编译编译
且易于安装的科学计算Python包。
Python扩展包的非官方Windows二进制文件(库)
----------------------------------------------------------
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
很多人在Windows平台上做科学计算,然而众所周知的是,其中很多科学计算包在该平台上
难以构建和安装。不过, `Christoph Gohlke `_ 将一系列有用的Python包编译成了Windows的二进制文件,其数量还在不断增长。如果您在
Windows上工作,您也许想要看看。
Anaconda
---------
+~~~~~~~~
-`Continuum Analytics `_ 提供了
-`Anaconda Python Distribution `_,它
-拥有所有常见的Python科学包,也包括与数据分析和大数据相关的包。Anaconda是免费的
-而Continuum销售一些专有的额外组件。学术研究者可以获取这些组件的免费许可。
+`Anaconda Python 发行版 `_
+包含所有常见的Python科学包,也包括与数据分析和大数据相关的包。Anaconda是免费的
+也有一些收费的个人插件。学术研究者可以获取这些插件的免费许可。
Canopy
-------
+~~~~~~
-`Canopy `_ 是另一个Python科学发布版,由
+`Canopy `_ 是另一个Python科学发布版,由
`Enthought `_ 提供。其受限制的 'Canopy Express' 版本
是免费提供的,但是Enthought负责完整版。学术研究者可以获取到免费许可。
diff --git a/docs/scenarios/scrape.rst b/docs/scenarios/scrape.rst
index 73bc366..15b322a 100644
--- a/docs/scenarios/scrape.rst
+++ b/docs/scenarios/scrape.rst
@@ -1,23 +1,29 @@
+
+#############
HTML 抓取
-=============
+#############
+
+.. image:: /_static/photos/34268661876_442428e122_k_d.jpg
-.. image:: https://farm3.staticflickr.com/2900/34268661876_442428e122_k_d.jpg
+************
Web抓取
-------------
+************
Web站点使用HTML描述,这意味着每个web页面是一个结构化的文档。有时从中
获取数据同时保持它的结构是有用的。web站点不总是以容易处理的格式,
-如 ``csv`` 或者 ``json`` 提供它们的数据。
+如 CSV 或者 JSON 提供它们的数据。
这正是web抓取出场的时机。Web抓取是使用计算机程序将web页面数据进行收集
并整理成所需格式,同时保存其结构的实践。
+
+*****************
lxml和Requests
------------------
+*****************
`lxml `_ 是一个优美的扩展库,用来快速解析XML以及HTML文档
-即使所处理的标签非常混乱。我们也将使用 `Requests `_
+即使所处理的标签非常混乱。我们也将使用 `Requests `_
模块取代内建的urllib2模块,因为其速度更快而且可读性更好。您可以通过使用
``pip install lxml`` 与 ``pip install requests`` 命令来安装这两个模块。
@@ -68,8 +74,8 @@ XPath是一种在结构化文档(如HTML或XML)中定位信息的方式。
.. code-block:: python
- print 'Buyers: ', buyers
- print 'Prices: ', prices
+ print('Buyers: ', buyers)
+ print('Prices: ', prices)
::
@@ -90,6 +96,3 @@ XPath是一种在结构化文档(如HTML或XML)中定位信息的方式。
我们可以考虑一些更酷的想法:修改这个脚本来遍历该例数据集中剩余的页面,或者
使用多线程重写这个应用从而提升它的速度。
-
-如果您想学习如何使用python导入数据 - 这个 `DataCamp 数据导入课程 `_
-是个开始的好地方。
diff --git a/docs/scenarios/serialization.rst b/docs/scenarios/serialization.rst
index 0802115..fb48cf5 100644
--- a/docs/scenarios/serialization.rst
+++ b/docs/scenarios/serialization.rst
@@ -1,38 +1,223 @@
-==================
+
+##################
数据序列化
-==================
+##################
-.. image:: https://farm3.staticflickr.com/2927/33467946364_3e59bd376a_k_d.jpg
+.. image:: /_static/photos/33467946364_3e59bd376a_k_d.jpg
+
+***************************
什么是数据序列化?
----------------------------
+***************************
+
+数据序列化是指将结构化数据转换成允许以共享或存储的格式,并能恢复成原始结构。
+在某些情况下,数据序列化的第二个目的是减少数据大小,从而减小对磁盘和带宽的要求。
+
+********************
+Flat vs. Nested data
+********************
+
+在开始序列化数据之前,确定或决定在数据序列化期间如何结构化数据(扁平或嵌套)是非常重要的。
+以下示例中显示了两种风格的差异。
+
+扁平风格:
+
+.. code-block:: python
+
+ { "Type" : "A", "field1": "value1", "field2": "value2", "field3": "value3" }
+
+
+嵌套风格:
+
+.. code-block:: python
+
+ {"A"
+ { "field1": "value1", "field2": "value2", "field3": "value3" } }
+
+阅读两种风格的更多内容,请见如下讨论:
+`Python mailing list `__,
+`IETF mailing list `__ and
+`in stackexchange `__.
+
+****************
+序列化文本
+****************
+
+=======================
+简单文件(扁平数据)
+=======================
+
+如果要序列化的数据位于文件中,并包含扁平数据,则Python提供了两种序列化数据的方法。
+
+repr
+----
+
+Python 中的 repr 方法接收单个对象参数,返回输入的可打印形式:
+
+.. code-block:: python
+
+ # 扁平文本作为输入
+ a = { "Type" : "A", "field1": "value1", "field2": "value2", "field3": "value3" }
+
+ # 相同的输入可以读取自文件
+ a = open('/tmp/file.py', 'r')
+
+ # 返回输入的可打印形式
+ # 输出也能够写入文件
+ print(repr(a))
+
+ # 使用repr将内容写入文件
+ with open('/tmp/file.py') as f:f.write(repr(a))
+
+
+ast.literal_eval
+----------------
+
+literal_eval 方法安全地解析Python数据类型表达式并求值。其支持的数据类型有:字符串、数字、元组、列表、字典、布尔和None。
+
+.. code-block:: python
+
+ with open('/tmp/file.py', 'r') as f: inp = ast.literal_eval(f.read())
+
+====================
+CSV 文件 (扁平数据)
+====================
+
+Python 中的 CSV 模块实现了读取和写入CSV形式的表格数据的类。
+
+读取的简单例子:
+
+.. code-block:: python
+
+ # 从文件中读取CSV数据
+ import csv
+ with open('/tmp/file.csv', newline='') as f:
+ reader = csv.reader(f)
+ for row in reader:
+ print(row)
-数据序列化是将结构化数据转换成允许以共享或存储的格式,可恢复其原始结构的概念。
-在某些情况下,数据序列化的第二个目的是将要序列化数据的大小最小化,从而使磁盘空间
-或带宽要求最小化。
+写入的简单例子:
-Pickle
-------
+.. code-block:: python
+
+ # 将CSV数据写入文件
+ import csv
+ with open('/temp/file.csv', 'w', newline='') as f:
+ writer = csv.writer(f)
+ writer.writerows(iterable)
+
+
+该模块的内容、函数和例子可以在
+`Python 文档中 `__ 查阅。
+
+==================
+YAML (嵌套数据)
+==================
+
+Python 中有许多第三方库用来解析和读取/写入 YAML 文件,例子如下:
+
+.. code-block:: python
+
+ # 使用load方法从文件中读取 YAML 内容
+ import yaml
+ with open('/tmp/file.yaml', 'r', newline='') as f:
+ try:
+ print(yaml.load(f))
+ except yaml.YAMLError as ymlexcp:
+ print(ymlexcp)
+
+第三方库的文档可以在
+`PyYAML 文档 `__ 中查阅。
+
+=======================
+JSON 文件 (嵌套数据)
+=======================
+
+Python 的 JSON 模块可以用来读取和写入 JSON 模块。示例如下:
+
+读取:
+
+.. code-block:: python
+
+ # 从文件中读取 JSON 内容
+ import json
+ with open('/tmp/file.json', 'r') as f:
+ data = json.load(f)
+
+写入:
+
+.. code-block:: python
+
+ # 使用 dump 方法将 JSON 内容写入文件
+ import json
+ with open('/tmp/file.json', 'w') as f:
+ json.dump(data, f, sort_keys=True)
+
+=================
+XML (嵌套数据)
+=================
+
+Python 中 XML 的解析可以使用 `xml` 库。
+
+示例:
+
+.. code-block:: python
+
+ # 从文件中读取 XML 内容
+ import xml.etree.ElementTree as ET
+ tree = ET.parse('country_data.xml')
+ root = tree.getroot()
+
+使用 `xml.dom` 和 `xml.sax` 包的更多文档可以在
+`Python XML 库文档 `__ 中找到。
+
+*******
+二进制
+*******
+
+=======================
+NumPy Array (扁平数据)
+=======================
+
+Python 的 NumPy 数组可以将数据序列化成字节形式,或从字节形式的数据反序列化。
+
+示例:
+
+.. code-block:: python
+
+ import NumPy as np
+
+ # 将 NumPy 数组转换为字节形式
+ byte_output = np.array([ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]).tobytes()
+
+ # 将字节形式转换回 NumPy 数组
+ array_format = np.frombuffer(byte_output)
+
+=======================
+Pickle (扁平数据)
+=======================
Python原生的数据序列化模块称为 `Pickle `_ 。
-例子如下:
+示例:
.. code-block:: python
- import pickle
-
- #Here's an example dict
- grades = { 'Alice': 89, 'Bob': 72, 'Charles': 87 }
+ import pickle
+
+ # 示例字典
+ grades = { 'Alice': 89, 'Bob': 72, 'Charles': 87 }
- #Use dumps to convert the object to a serialized string
- serial_grades = pickle.dumps( grades )
+ # 使用 dumps 将对象转换为序列化字符串
+ serial_grades = pickle.dumps( grades )
- #Use loads to de-serialize an object
- received_grades = pickle.loads( serial_grades )
+ # 使用 loads 反序列化为对象
+ received_grades = pickle.loads( serial_grades )
+
+********
Protobuf
---------
+********
如果您正在寻找支持多种语言的序列化模块,那么Google的 `Protobuf
`_ 库就是一个选择。
diff --git a/docs/scenarios/speed.rst b/docs/scenarios/speed.rst
index 7ffc7b3..7c4ab8e 100644
--- a/docs/scenarios/speed.rst
+++ b/docs/scenarios/speed.rst
@@ -1,7 +1,9 @@
+
+#####
速度
-=====
+#####
-.. image:: https://farm3.staticflickr.com/2826/33175625804_e225b90f3e_k_d.jpg
+.. image:: /_static/photos/33175625804_e225b90f3e_k_d.jpg
CPython作为最流行的Python环境,对于CPU密集型任务(CPU bound tasks)较慢,而 `PyPy`_ 则较快。
@@ -33,8 +35,10 @@ CPython作为最流行的Python环境,对于CPU密集型任务(CPU bound tas
1.54693889618
1.60109114647
+
+*******
Context
-:::::::
+*******
The GIL
@@ -48,22 +52,24 @@ David Beazley 有一个关于GIL如何工作的 `指导`_ 。他也讨论了 Pyt
它如何影响您的特定程序,您拥有多少核,以及您程序瓶颈在哪。
C 扩展
-------------
+--------------
GIL
--------
+---
当写一个C扩展时必须 `特别关注`_ 在解释器中注册您的线程。
+
+************
C 扩展
-::::::::::::
+************
Cython
------
-`Cython `_ 是Python语言的一个超集,对其您可以为Python写C
+`Cython `_ 是Python语言的一个超集,对其您可以为Python写C
或C++模块。Cython也使得您可以从已编译的C库中调用函数。使用Cython让您得以发挥Python
的变量与操作的强类型优势。
@@ -149,25 +155,25 @@ Cython
.. code-block:: python
import time
- #启动pyx编译器
+ # 启动pyx编译器
import pyximport
pyximport.install()
- #Cython的素数算法实现
+ # Cython的素数算法实现
import primesCy
- #Python的素数算法实现
+ # Python的素数算法实现
import primes
- print "Cython:"
+ print("Cython:")
t1= time.time()
- print primesCy.primes(500)
+ print(primesCy.primes(500))
t2= time.time()
- print "Cython time: %s" %(t2-t1)
- print ""
- print "Python"
+ print("Cython time: %s" %(t2-t1))
+ print("")
+ print("Python")
t1= time.time()
- print primes.primes(500)
+ print(primes.primes(500))
t2= time.time()
- print "Python time: %s" %(t2-t1)
+ print("Python time: %s" %(t2-t1))
这两行代码需要一些说明:
@@ -209,8 +215,10 @@ Pyrex
Shedskin?
---------
-Concurrency
-:::::::::::
+
+***********
+并发
+***********
Concurrent.futures
@@ -314,7 +322,7 @@ add_done_callback(fn)
有关使用 `concurrent.futures`_ 模块的更多信息,请参阅官方文档。
-Threading
+threading
---------
标准库带有一个 `threading`_ 模块,允许用户手动处理多个线程。
@@ -351,7 +359,7 @@ Threading
由于多个线程可以访问相同的内存部分,有时可能会出现两个或多个线程尝试同时写入同一资源的情况,
或者输出取决于某些事件的顺序或时序。 这被称为 `数据竞争` 或竞争条件。当这种情况发生时,
-输出将会出现乱码,或者可能会遇到难以调试的问题。 `stackoverflow post`_ 是个很好的例子。
+输出将会出现乱码,或者可能会遇到难以调试的问题。 `Stack Overflow post`_ 是个很好的例子。
可以避免的方法是每个线程在写入共享资源之前获取 `Lock`_ 。 锁可以通过环境上下文协议
( `with` 语句)或直接使用 `acquire()` 和 `release()` 来获取和释放。
@@ -389,22 +397,22 @@ Threading
Spawning Processes
-------------------
+~~~~~~~~~~~~~~~~~~
Multiprocessing
----------------
+~~~~~~~~~~~~~~~
.. _`PyPy`: http://pypy.org
-.. _`GIL`: http://wiki.python.org/moin/GlobalInterpreterLock
+.. _`GIL`: https://wiki.python.org/moin/GlobalInterpreterLock
.. _`指导`: http://www.dabeaz.com/python/UnderstandingGIL.pdf
.. _`新GIL`: http://www.dabeaz.com/python/NewGIL.pdf
-.. _`特别关注`: http://docs.python.org/c-api/init.html#threads
+.. _`特别关注`: https://docs.python.org/c-api/init.html#threads
.. _`David Beazley的`: http://www.dabeaz.com/GIL/gilvis/measure2.py
.. _`concurrent.futures`: https://docs.python.org/3/library/concurrent.futures.html
.. _`Future`: https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.Future
.. _`threading`: https://docs.python.org/3/library/threading.html
-.. _`stackoverflow post`: http://stackoverflow.com/questions/26688424/python-threads-are-printing-at-the-same-time-messing-up-the-text-output
+.. _`Stack Overflow post`: https://stackoverflow.com/questions/26688424/python-threads-are-printing-at-the-same-time-messing-up-the-text-output
.. _`data race`: https://en.wikipedia.org/wiki/Race_condition
.. _`Lock`: https://docs.python.org/3/library/threading.html#lock-objects
diff --git a/docs/scenarios/web.rst b/docs/scenarios/web.rst
index 65ba7f7..648b3ba 100644
--- a/docs/scenarios/web.rst
+++ b/docs/scenarios/web.rst
@@ -1,16 +1,17 @@
-================
+
+#############################
Web 应用 & 框架
-================
+#############################
-.. image:: https://farm3.staticflickr.com/2891/34309496175_b82d104282_k_d.jpg
+.. image:: /_static/photos/34309496175_b82d104282_k_d.jpg
Python作为一门强大的脚本语言,能够适应快速原型和较大项目的制作,
它被广泛用于web应用程序的开发中。
-Context
-:::::::
-
+*******
+Context
+*******
WSGI
----
@@ -21,8 +22,9 @@ Web服务网关接口(Web Server Gateway Interface,简称“WSGI”)是一
:ref:` 符合WSGI的web服务器 ` 上。WSGI记录在 :pep:`3333`。
+*******
框架
-::::::::::
+*******
广义地说,Web框架包含一系列库和一个主要的处理器(handler),这样您就能够构建自己的代码来实现Web应用
(比如说一个交互式的网站)。大多数web框架包含模式和工具,至少实现以下功能:
@@ -43,14 +45,15 @@ Web服务器开发(Development Web Server)
Django
------
-`Django `_ 是一个功能齐备的web应用框架。它是创建面向内容网站的极佳选择。
+`Django `_ 是一个功能齐备的web应用框架。它是创建面向内容网站的极佳选择。
通过提供众多工具和模式,Django使得快速构建复杂的、有数据库支持的web应用成为可能,
同时鼓励使用它作为编写代码的最佳实践。
-Django拥有非常庞大和活跃的社区。此外,许多预构建的 `可重用模块 `_
+Django拥有非常庞大和活跃的社区。此外,许多预构建的 `可重用模块 `_
可以原样合并到新工程中,或者定制成符合需求的样子。
-在 `美国 `_ 和 `欧洲 `_ 均有每年度的Django会议。
+在 `美国 `_ 、 `欧洲 `_ 和
+`Australia `_ 均有每年度的Django会议。
如今大部分新的Python web应用都是用Django构建的。
@@ -71,8 +74,20 @@ Flask不会提供一切您可能需要的内容,而是实现了web应用框架
Flask是任何不适用Django的Python web应用的默认选择。
+Falcon
+------
+
+当您的目标是构建快速、可扩展的REST风格API微服务时, `Falcon `_ 是个不错的选择。
+
+这是一个可靠的、高性能的Python Web框架,用于构建大规模应用后端和微服务。Falcon鼓励REST架构风格的
+URI到资源的映射,以花费尽可能少的精力同时又保持高效。
+
+Falcon重点关注四个方面:速度、可靠性、灵活性和可调试性。它通过"响应者(responder)"
+(诸如 ``on_get()``、 ``on_put()`` 等)来实现HTTP。这些响应者接收直接的请求,以及响应对象。
+
+
Tornado
---------
+-------
`Tornado `_ 是一个面向Python的异步web框架,它有自己的事件。
这就使得它,举个例子,可以原生地支持WebSockets。编写良好的Tornado应用具有卓越的性能特性。
@@ -80,17 +95,44 @@ Tornado
Pyramid
---------
+-------
`Pyramid `_ 是一个非常灵活的框架,重点关注模块化。 它内置少量库(“电池”),
-并鼓励用户扩展其基本功能。
+并鼓励用户扩展其基本功能。它提供一组cookiecutter模板,帮助用户生成新项目。Pyramid驱动了Python基础架构中
+最重要部分之一—— `PyPI `_。
Pyramid不像Django和Flask,并没有庞大的用户基数。它一个有能力的框架,但如今新Python web 应用程序
并没有十分青睐它。
+Masonite
+--------
+
+`Masonite `_ 是一个现代的,以开发人员为中心的“功能齐备”的网络框架。
+Masonite 框架遵循 MVC(Model-View-Controller,模型-视图-控制器)架构模式,受到 Rails 和 Laravel 等框架的极大启发,
+因此如果您是从 Ruby 或 PHP 背景来到 Python,那么您将感到宾至如归!
+
+Masonite 提供了许多开箱即用的功能,包括一个功能强大的具有自动解析依赖注入IOC容器、craft 命令行工具和 Active Record 模式的 Orator ORM。
+
+Masonite 非常适合初学者或经验丰富的开发人员。从安装到部署都相当快速和容易。只需尝试一次,你就会爱上它。
+
+FastAPI
+-------
+
+`FastAPI `_ 是一个使用 Python 3.6+ 版本来构建API的现代化 Web 框架。
+
+由于它是基于 `Starlette `_ 和 `Pydantic `_,
+具有非常高的性能。
+
+FastAPI 利用函数参数中标准的 Python 类型声明来声明请求参数和实体、执行数据转换(序列化、分析)、数据验证,
+以及使用 ** OpenAPI 3 **(包括 ** JSON Schema **)自动生成 API 文档。
+
+它包括用于安全性和身份验证的工具和实用程序(包括带有JWT令牌的OAuth2)、依赖注入系统、交互式 API 文档生成器以及其他功能。
+
+
+***********
Web 服务端
-:::::::::::
+***********
.. _nginx-ref:
@@ -104,8 +146,10 @@ Nginx
.. _wsgi-servers-ref:
+
+************
WSGI 服务器
-::::::::::::
+************
独立WSGI服务器相比传统web服务器,使用更少的资源,并提供最高的性能 [1]_。
@@ -114,7 +158,7 @@ WSGI 服务器
Gunicorn
--------
-`Gunicorn `_ (Green Unicorn,绿色独角兽)是一个纯Python WSGI服务器,
+`Gunicorn `_ (Green Unicorn,绿色独角兽)是一个纯Python WSGI服务器,
用来支持Python应用。不像其他Python web服务器,它有周全的用户界面,十分易于使用和配置。
Gunicorn具有合理的默认配置。 然而,其他一些像uWSGI这样的服务器相较而言过于可定制化,因此更加难以高效使用。
@@ -147,16 +191,18 @@ uWSGI既能当作独立的web路由器来运行,也能运行在一个完整web
.. _server-best-practices-ref:
+*********************
服务端最佳实践
-:::::::::::::::::::::
+*********************
如今,自承载Python应用的主体托管于WSGI服务器(比如说 :ref:`Gunicorn `)
或是直接或间接在轻量级web服务器(比如说 :ref:`nginx `)之后。
WSGI服务器为Python应用服务,它能更好的处理诸如静态文件服务、请求路由、DDoS保护和基本认证的任务。
+*******
Hosting
-:::::::
+*******
平台即服务(Platform-as-a-Service,PaaS)是一种云计算基础设施类型,抽象和管理基础设施、路由和网络应用的扩展。
使用PaaS时,应用开发者只需关注编写应用代码,而无须关心配置细节。
@@ -164,27 +210,21 @@ Hosting
Heroku
------
-`Heroku `_ 为Python 2.7-3.5 应用程序提供一流的支持。
+`Heroku `_ 为Python 2.7-3.5 应用程序提供一流的支持。
Heroku 支持所有类型的Python web应用、服务器和框架。在Heroku上可以免费开发应用程序。
一旦您的应用程序准备好面向生产环境,您可以升级到Hobby或专业应用。
-Heroku 维护了使用Python和Heroku交互的 `详细文章 `_,
+Heroku 维护了使用Python和Heroku交互的 `详细文章 `_,
同时也有 `手把手指导 `_
来告诉您如何建立第一个应用。
Heroku是如今部署Python Web应用程序的推荐PaaS。
-Eldarion
---------
-
-`Eldarion `_(被称为Gondor)是由Kubernetes、CoreOS和Docker提供的PaaS。
-它们支持任一WSGI应用程序,并提供了部署
-`Django项目 `_ 的指南。
-
+**********
模板
-::::::::::
+**********
多数WSGI应用响应HTTP请求,从而服务于HTML或其他标记语言中的内容。关注点分离的概念建议我们使用模板,
而不是直接由Python生成文本内容。模板引擎管理一系列的模板文件,其系统的层次性和包容性避免了不必要的重复。
@@ -213,7 +253,7 @@ Jinja2
它使用基于文本的模板语言,因此可以用于生成任何类型的标记,而不仅仅是HTML。
它允许自定义过滤器,标签,测试和全局变量。 它具有Django模板系统的许多改进。
-这里有一些在Jinja2中重要的html标签:
+这里有一些在Jinja2中重要的HTML标签:
.. code-block:: html
@@ -323,12 +363,12 @@ Jinja2是新Python Web应用程序的推荐模板库。
Chameleon
---------
`Chameleon `_ 页面模板是使用
-`模板属性语言(Template Attribute Language, TAL) `_、
+`模板属性语言(Template Attribute Language, TAL) `_、
`TAL表达语法(TAL Expression Syntax,TALES) `_ 和
`宏扩展TAL(Macro Expansion TAL, Metal) `_
语法的HTML/XML模板引擎实现。
-Chameleon在Python2.5及以上版本(包括3.x和pypy)都是可用的,并常被 `Pyramid Framework `_ 使用。
+Chameleon在Python2.5及以上版本(包括3.x和PyPy)都是可用的,并常被 `Pyramid Framework `_ 使用。
页面模板是在文档结构中添加特定元素属性和文本标记。使用一系列简单语言概念,您能够控制文档流程、元素重复、文本替换和翻译。
由于使用了基于属性的语法,未渲染的页面模板是合法的HTML,它可以在浏览器中查看,甚至能够在WYSIWYG编辑器中编辑。
@@ -416,4 +456,6 @@ Mako在Python web社区中受到重视。
.. rubric:: References
-.. [1] `Benchmark of Python WSGI Servers `_
+.. [1] `mod_python 项目现在正式终结 `_
+.. [2] `mod_wsgi vs mod_python `_
+.. [3] `Python WSGI 服务器基准测试 `_
diff --git a/docs/scenarios/xml.rst b/docs/scenarios/xml.rst
index 3fff126..e10d75d 100644
--- a/docs/scenarios/xml.rst
+++ b/docs/scenarios/xml.rst
@@ -1,10 +1,13 @@
+
+###########
XML解析
-===========
+###########
-.. image:: https://farm3.staticflickr.com/2808/33888714601_a1f7d020a2_k_d.jpg
+.. image:: /_static/photos/33888714601_a1f7d020a2_k_d.jpg
+********
untangle
---------
+********
`untangle `_ 库可以将XML文档映射为一个Python
对象,该对象于其结构中包含了原文档的节点与属性信息。
@@ -34,10 +37,11 @@ untangle
untangle也支持从字符串或URL中载入XML。
+*********
xmltodict
----------
+*********
-`xmltodict `_ 是另一个简易的库,
+`xmltodict `_ 是另一个简易的库,
它致力于将XML变得像JSON。
对于一个像这样的XML文件:
@@ -74,3 +78,30 @@ xmltodict
xmltodict 也有unparse函数让您可以转回XML。该函数有一个streaming模式适合用来
处理不能放入内存的文件,它还支持命名空间。
+
+**********
+xmlschema
+**********
+
+`xmlschema `_ 提供了在Python中使用XSD模式的支持。
+与其他XML库不同,它提供了自动类型解析功能。因此,例如,如果模式定义一个元素为 ``int`` 类型,解析后的 ``dict`` 也将包含该元素的 ``int`` 值。
+此外,该库支持自动和显式验证XML文档是否符合模式。
+
+.. code-block:: python
+
+ from xmlschema import XMLSchema, etree_tostring
+
+ # 加载XSD模式文件
+ schema = XMLSchema("your_schema.xsd")
+
+ # 验证是否符合模式
+ schema.validate("your_file.xml")
+
+ # 或者
+ schema.is_valid("your_file.xml")
+
+ # 解码文件
+ data = schmema.decode("your_file.xml")
+
+ # 编码为字符串
+ s = etree_tostring(schema.encode(data))
diff --git a/docs/shipping/freezing.rst b/docs/shipping/freezing.rst
index 2d76476..91c106a 100644
--- a/docs/shipping/freezing.rst
+++ b/docs/shipping/freezing.rst
@@ -1,8 +1,9 @@
.. _freezing-your-code-ref:
-==============================
+
+##############################
冻结(freezing)您的代码
-==============================
+##############################
.. image:: https://farm5.staticflickr.com/4227/33907151034_e0a9e53402_k_d.jpg
@@ -18,8 +19,10 @@
冻结的一个缺点是它会增加大约2-12MB的发行大小。另外,如果修补了Python的安全漏洞,
您将负责分发更新版本的应用程序。
+
+************************
冻结的多种方式
-------------------------
+************************
:ref:`打包您的代码` 是指把您的库或工具分发给其他开发者。
@@ -29,33 +32,37 @@
.. todo:: 完善 "冻结您的代码" 部分(stub)。
+************************
比较冻结工具
-----------------------
+************************
+
+写于2019年10月5日
各解决方案的平台/特性支持性
-=========== ======= ===== ==== ======== ======= ============= ============== ==== =====================
-Solution Windows Linux OS X Python 3 License One-file mode Zipfile import Eggs pkg_resources support
-=========== ======= ===== ==== ======== ======= ============= ============== ==== =====================
-bbFreeze yes yes yes no MIT no yes yes yes
-py2exe yes no no yes MIT yes yes no no
-pyInstaller yes yes yes yes GPL yes no yes no
-cx_Freeze yes yes yes yes PSF no yes yes no
-py2app no no yes yes MIT no yes yes yes
-=========== ======= ===== ==== ======== ======= ============= ============== ==== =====================
+=========== ======= ===== ==== ======== ======= ============= ============== ==== ===================== =====================
+Solution Windows Linux OS X Python 3 License One-file mode Zipfile import Eggs pkg_resources support Latest release date
+=========== ======= ===== ==== ======== ======= ============= ============== ==== ===================== =====================
+bbFreeze yes yes yes no MIT no yes yes yes Jan 20, 2014
+py2exe yes no no yes MIT yes yes no no Oct 21, 2014
+pyInstaller yes yes yes yes GPL yes no yes no Jul 9, 2019
+cx_Freeze yes yes yes yes PSF no yes yes no Aug 29, 2019
+py2app no no yes yes MIT no yes yes yes Mar 25, 2019
+=========== ======= ===== ==== ======== ======= ============= ============== ==== ===================== =====================
.. note::
从Linux到Windows的冻结只有PyInstaller支持,
- `其余的 `_。
+ `其余的 `_。
.. note::
- 所有解决方案需要目前机器上安装了MS Visual C++ dll。除了py2app以外。
- 只有Pyinstaller创建了可以自足运行的exe文件,其绑定了dll,可以传递 ``--onefile`` 到
- :file:`Configure.py`。
+ 所有解决方案,除了py2app以外,需要在目标机器上安装了Microsoft Visual C++ dll。
+ 只有PyInstaller可通过传递 ``--onefile`` 到 :file:`Configure.py` 中,
+ 创建绑定了合适dll、可以自运行的exe文件。
+*******
Windows
--------
+*******
bbFreeze
~~~~~~~~
@@ -108,7 +115,7 @@ py2exe
~~~~~~
-前置要求是安装了 :ref:`Python on Windows `。
+前置要求是安装了 :ref:`Python on Windows `。py2exe 的最后一个版本是从2014年开始的,且没有处于积极的开发中。
1. 下载并且安装 http://sourceforge.net/projects/py2exe/files/py2exe/
@@ -126,7 +133,7 @@ py2exe
3. (可选) `包含图标 `_
-4. (可选) `单文件模式 `_
+4. (可选) `单文件模式 `_
5. 生成 :file: `.exe` 到 :file:`dist` 目录:
@@ -145,8 +152,9 @@ PyInstaller
- `手册 `_
+****
OS X
-----
+****
py2app
@@ -209,12 +217,52 @@ PyInstaller可用于在Mac OS X 10.6(Snow Leopard)或更新版本上构建Un
`_ 。
例如,要指定应用程序的图标,请使用 :code:`icon=\path\to\icon.icns` 选项。
+*****
Linux
------
+*****
bbFreeze
~~~~~~~~
+.. warning:: bbFreeze 仅在 Python 2.x 环境下工作, 根据以前的维护者的说法已不再进行维护。 如果您对此感兴趣请查看 `这里 `_。
+
+bbFreeze可以与所有已安装Python以及pip2和/或easy_install的发行版一起使用。
+
+对于pip2,请按以下内容进行:
+
+.. code-block:: console
+
+ $ pip2 install bbfreeze
+
+而对于 easy_install,则:
+
+.. code-block:: console
+
+ $ easy_install bbfreeze
+
+安装好bbFreeze后,您就可以冻结应用程序了。
+
+假设您有一个脚本,例如“hello.py”和名为“module.py”的模块,并且您在里面使用了一个函数。
+不费吹灰之力,您就可以通过冻结脚本的主要入口来冻结整个内容:
+
+.. code-block:: console
+
+ $ bbfreeze script.py
+
+这样,它就会创建一个名为dist/的文件夹,其中包含脚本的可执行文件以及Python脚本中使用的库所需.so(共享对象)文件。
+
+或者,您可以创建一个用于执行冻结的脚本。 冻结器的API可从以下库中获得:
+
+.. code-block:: python
+
+ from bbfreeze import Freezer
+
+ freezer = Freezer(distdir='dist')
+ freezer.addScript('script.py', gui_only=True) # 为使用GUI包的应用开启参数 gui_only
+ freezer()
PyInstaller
~~~~~~~~~~~
+PyInstaller在Linux上的安装方式与在OS X中类似,参见OS X章节中的对应部分。
+
+不要忘记安装如Python和pip等依赖项。
diff --git a/docs/shipping/packaging.rst b/docs/shipping/packaging.rst
index c329934..df825ba 100644
--- a/docs/shipping/packaging.rst
+++ b/docs/shipping/packaging.rst
@@ -1,13 +1,14 @@
.. _packaging-your-code-ref:
-===================
+
+###################
打包您的代码
-===================
+###################
.. image:: https://farm5.staticflickr.com/4325/36137234682_be6898bf57_k_d.jpg
-打包就是把您的代码分享给其他开发者。作为例子,共享一个库给其他开发者用在
-它们的应用中,或者作为一个开发工具,比如 'py.test'。
+打包就是把您的代码分享给其他开发者。例如,共享一个库给其他开发者用在
+他们的应用中,或者作为一个开发工具,比如 'py.test'。
这种分发方式的一个优势是它拥有既已建成的良好的工具生态,如PyPI与pip,其使得其他
开发者很容易下载与安装您的包,而无论是一个即兴实验还是作为一个巨型软件系统的一部分。
@@ -23,9 +24,9 @@
提供了更多关于如何创建以及维护Python包的知识。
-
+*************************
打包的多种方式
-:::::::::::::::::::::::::
+*************************
为了分发应用给最终用户,您应该
:ref:`冻结您的应用 `。
@@ -35,20 +36,19 @@
(例 对于Debian或Ubuntu是一个 .deb文件)
+*********************
对于Python开发者
-:::::::::::::::::::::
+*********************
-如果您编写了一个开源的Python模块, `PyPI `_
-, 更多属性参见 *The Cheeseshop*,这是一个放它的地方。
+如果您编写了一个开源的Python模块, `PyPI `_
+(更准确的叫法是 *The Cheeseshop*)是一个放它的地方。
Pip vs. easy_install
--------------------
-Use `pip `_. More details
-`here `_
-使用 `pip `_. 更多细节参见
-`here `_
+使用 `pip `_. 更多细节参见
+`here `_
私人的PyPI
@@ -73,10 +73,10 @@ Use `pip `_. More details
.. code-block:: console
$ cd archive
- $ python -m SimpleHTTPServer 9000
+ $ python -m http.server 9000
-这运行了一个简单的http服务器,其监听端口9000并且将列出所有包(比如 **MyPackage**)。现在
+这运行了一个简单的HTTP服务器,其监听端口9000并且将列出所有包(比如 **MyPackage**)。现在
您可以使用任何Python包安装器从您的服务器中安装 **MyPackage** 。若使用Pip,您可以这样做:
.. code-block:: console
@@ -96,12 +96,12 @@ Use `pip `_. More details
pypiserver
++++++++++
-`Pypiserver `_ 是一个精简的PyPI兼容服务器。
+`Pypiserver `_ 是一个精简的PyPI兼容服务器。
它可以被用来让一系列包通过easy_install与pip进行共享。它包含一些有益的命令,诸如管理
命令( ``-U`` ),其可以自动更新所有它的包到PyPI上的最新版。
-S3-Hosted PyPi
+S3-Hosted PyPI
++++++++++++++
@@ -137,13 +137,14 @@ Amazon AWS账号并且有 S3 bucket。
.. _packaging-for-linux-distributions-ref:
+***********************
在Linux上分发
-::::::::::::::::::::::::
+***********************
创建一个Linux分发包对于Linux来说是个正确的决定。
-因为分发包可以不包含Python解释器,它使得下载与安装这些包可以减小2MB,
+因为分发包可以不包含Python解释器,它使得下载与安装这些包可以减小2-12 MB,
:ref:`freezing your application `.
并且,如果Python有了更新的版本,则您的应用可以自动使用新版本的Python。
@@ -154,9 +155,9 @@ bdist_rpm命令使得 `producing an RPM file `
- 其将产生独立可执行的文件给所有Linux发布版,就像Windows与OSX上一样,
+ 其将产生独立可执行的文件给所有Linux发布版,就像Windows与OS X上一样,
创建一个对Python版本敏感的分发包也会造成问题。可能需要告诉Ubuntu的 *一些版本* 的
用户他们需要增加 `the 'dead-snakes' PPA `_
@@ -177,4 +178,4 @@ bdist_rpm命令使得 `producing an RPM file `_
- `alien `_
-- `dh-virtualenv `_ (for APT/DEB omnibus packaging)
+- `dh-virtualenv `_ (用于 APT/DEB 综合打包)
diff --git a/docs/shipping/publishing.rst b/docs/shipping/publishing.rst
new file mode 100644
index 0000000..70f31d2
--- /dev/null
+++ b/docs/shipping/publishing.rst
@@ -0,0 +1,61 @@
+.. _publishing-your-code-ref:
+
+
+####################
+发布您的代码
+####################
+
+.. todo:: Replace this kitten with the photo we want.
+
+.. image:: https://placekitten.com/800/600
+
+一个健康的开源项目需要一个地方来发布其代码和项目管理的内容,以便其他开发人员可以与您协作。
+这可以让您的用户更好地了解您的代码,跟上新的开发进度,报告错误以及贡献代码。
+
+此开发网站应包括源代码历史本身,错误跟踪器,补丁提交(也称为“Pull Request”)队列,以及可能的其他面向开发人员的文档。
+
+有几个免费的开源项目托管站点(又名“forges”),如 GitHub,SourceForge,Bitbucket和GitLab。
+GitHub目前是最好的。
+使用GitHub吧。
+
+
+*********************************
+在GitHub上创建项目
+*********************************
+
+要在GitHub上发布您的Python项目:
+
+1. 如果您还没有GitHub帐户,请创建一个帐户
+
+2. 为您的项目创建一个新的仓库
+
+ 1. 单击页面右上角的头像旁边的“+”菜单,然后选择“New repository”
+
+ 2. 给项目命名,并给它一个SEO友好的描述
+
+ 3. 如果您没有现有项目仓库,请选择设置以添加 README、`.gitignore`和许可证。使用Python的 `.gitignore` 选项
+
+3. 在新创建的项目页面上,单击“Manage topics”并根据实际情况添加“python”和“python3”和/或“python2”标签
+
+4. 在项目的README中包含指向您的新GitHub仓库的链接,以便那些拿到项目分发版本的人知道在哪里找到它
+
+如果这是一个全新的仓库,请将其克隆到本地计算机并开始工作:
+
+.. code-block:: console
+
+ $ git clone https://github.com//
+
+或者,如果您已经有一个项目Git仓库,请将您的新GitHub仓库添加为远程:
+
+.. code-block:: console
+
+ $ cd
+ $ git remote add origin https://github.com//
+ $ git push --tags
+
+**************************
+当您的项目增长时
+**************************
+
+要了解更多关于管理开源软件项目的内容,请参见
+`Producing Open Source Software `_ 这本书。
diff --git a/docs/starting/install/linux.rst b/docs/starting/install/linux.rst
index 1ee5831..6758791 100644
--- a/docs/starting/install/linux.rst
+++ b/docs/starting/install/linux.rst
@@ -1,7 +1,9 @@
.. _install-linux:
+
+############################
在Linux上安装Python 2
-==========================
+############################
.. image:: https://farm5.staticflickr.com/4268/34435688560_4cc2a7bcbb_k_d.jpg
@@ -28,10 +30,12 @@
开发前,安装接下来教程中所介绍的工具和库。特别应该安装Setuptools和pip,它们将简化安装和使用
Python第三方库的流程。
+
+****************
Setuptools & Pip
-----------------
+****************
-`setuptools `_ 和 `pip `_
+`setuptools `_ 和 `pip `_
是最重要的两个Python第三方软件包。一旦安装了它们,就可以通过一条指令下载、安装和卸载可获取到的
Python应用包,还可以轻松地将这种网络安装的方式加入到自己开发的Python应用中。
@@ -45,8 +49,10 @@ Python 2.7.9 以及之后版本(Python2 系列),和Python 3.4以及之后版
`参考官方pip安装指南 `_ 获取pip工具,并自动安装最新版本的setuptools。
+
+****************
虚拟环境
---------------------
+****************
虚拟环境工具(virturalenv)通过为不同项目创建专属的Python虚拟环境,以实现其依赖的库独立保存在不同的路径。
这解决了“项目X依赖包版本1.x,但项目Y依赖包版本为4.x”的难题, 并且维持全局的site-packages目录干净、易管理。
@@ -59,5 +65,5 @@ Python 2.7.9 以及之后版本(Python2 系列),和Python 3.4以及之后版
--------------------------------
-该页是 `另一份指南 `_ 的混合版本,可通过同一份许可获取。
+该页是 `另一份指南 `_ 的混合版本,可通过同一份许可获取。
diff --git a/docs/starting/install/osx.rst b/docs/starting/install/osx.rst
index 0664641..62a0f12 100644
--- a/docs/starting/install/osx.rst
+++ b/docs/starting/install/osx.rst
@@ -1,16 +1,18 @@
.. _install-osx:
+
+###############################
在Mac OS X上安装Python 2
-=============================
+###############################
.. image:: https://farm5.staticflickr.com/4268/34435688560_4cc2a7bcbb_k_d.jpg
.. note::
查看我们的 :ref:`在OS X上安装Python 3指南`.
-最新版本的Mac OS X,High Sierra, **自带Python 2.7**。
+Mac OS X 自带 Python 2.7。
-您不必安装和配置即可直接使用Python进行开发。
+不必安装和配置即可直接使用Python进行开发。
话虽如此,我还是强烈建议各位,在正式开始Python应用开发前,安装接下来教程中所介绍的工具和库。
特别应该安装Setuptools——它将简化安装和使用Python第三方库的流程。
@@ -18,26 +20,27 @@ OS X自带的Python版本更适合用于学习而不是开发。因为版本与P
`_ 相比可能已经过时。
+**************
现在就开始吧!
---------------
+**************
跟着我一起安装真实版本的Python吧。
在正式安装之前,应先安装C编译器。最快的方式是运行 ``xcode-select --install`` 来安装Xcode命令行工具。
-您也可以从Mac应用商店下载完全版的 `XCode `_,
+您也可以从Mac应用商店下载完全版的 `Xcode `_,
或者更轻巧的 `OSX-GCC-Installer `_ 。
.. note::
- 如果已经安装了XCode,请不要再安装 OSX-GCC-Installer。两者结合可能会引发难以诊断的问题。
+ 如果已经安装了Xcode,请不要再安装 OSX-GCC-Installer。两者结合可能会引发难以诊断的问题。
.. note::
- 执行XCode的全新安装完成后,须在终端执行下述命令 ``xcode-select --install`` 来安装命令行工具。
+ 执行Xcode的全新安装完成后,须在终端执行下述命令 ``xcode-select --install`` 来安装命令行工具。
-尽管OS X系统附带了大量UNIX工具,熟悉Linux系统的人员使用时会发现缺少一个重要的组件——合适的包管理工具,
-`Homebrew `_ 正好填补了这个空缺。
+尽管OS X系统附带了大量Unix工具,熟悉Linux系统的人员使用时会发现缺少一个重要的组件——合适的包管理工具,
+`Homebrew `_ 正好填补了这个空缺。
-`安装 Homebrew `_ 只需打开 :file:`终端` 或个人常用的终端模拟器并运行:
+`安装 Homebrew `_ 只需打开 :file:`终端` 或个人常用的终端模拟器并运行:
.. code-block:: console
@@ -49,33 +52,32 @@ OS X自带的Python版本更适合用于学习而不是开发。因为版本与P
.. code-block:: console
- export PATH=/usr/local/bin:/usr/local/sbin:$PATH
+ export PATH="/usr/local/bin:/usr/local/sbin:$PATH"
接下来可以开始安装Python 2.7:
.. code-block:: console
- $ brew install python
+ $ brew install python@2
-或者 Python 3:
+因为 ``python@2`` 像一个“桶”,我们需要再次更新我们的``PATH``,以指向我们的新安装:
.. code-block:: console
- $ brew install python3
-
-耗时大概几分钟。
+ export PATH="/usr/local/opt/python@2/libexec/bin:$PATH"
Homebrew命名可执行文件 ``python2``,以便您仍然可以通过可执行文件“python”运行系统Python。
.. code-block:: console
- $ python -V # 系统Python解释器
+ $ python -V # Homebrew安装的Python 3解释器(如果安装了)
$ python2 -V # Homebrew安装的Python 2解释器
$ python3 -V # Homebrew安装的Python 3解释器(如果安装了)
+****************
Setuptools & Pip
-----------------
+****************
Homebrew会自动安装好Setuptools和 ``pip`` 。
Setuptools提供 ``easy_install`` 命令,实现通过网络(通常Internet)下载和安装第三方Python包。
@@ -89,12 +91,13 @@ Setuptools提供 ``easy_install`` 命令,实现通过网络(通常Internet
.. code-block:: console
$ pip2 -V # pip指向Homebrew安装的Python 2解释器
- $ pip3 -V # pip指向Homebrew安装的Python 3解释器(如果安装了)
-
+ $ pip -V # pip指向Homebrew安装的Python 3解释器(如果安装了)
+****************************************
虚拟环境(Virtual Environment)
---------------------------------------
+****************************************
+
虚拟环境工具(virturalenv)通过为不同项目创建专属的Python虚拟环境,以实现其依赖的库独立保存在不同的路径。
这解决了“项目X依赖包版本1.x,但项目Y依赖包版本为4.x”的难题,并且维持全局的site-packages目录干净、易管理。
@@ -104,4 +107,4 @@ Setuptools提供 ``easy_install`` 命令,实现通过网络(通常Internet
--------------------------------
-该页是 `另一份指南 `_ 的混合版本,可通过同一份许可获取。
\ No newline at end of file
+该页是 `另一份指南 `_ 的混合版本,可通过同一份许可获取。
diff --git a/docs/starting/install/win.rst b/docs/starting/install/win.rst
index 641655b..c3c2745 100644
--- a/docs/starting/install/win.rst
+++ b/docs/starting/install/win.rst
@@ -1,15 +1,17 @@
.. _install-windows:
+
+##############################
在Windows上安装Python 2
-============================
+##############################
.. image:: https://farm5.staticflickr.com/4268/34435688560_4cc2a7bcbb_k_d.jpg
.. note::
查看我们的 :ref:`在Windows上安装Python 3指南`.
-首先,从官网下载 `最新版本 `_
-的Python 2.7。如果想要确保下载到最新版本,单击 `Python官网 `_ 的
+首先,从官网下载 `最新版本 `_
+的Python 2.7。如果想要确保下载到最新版本,单击 `Python官网 `_ 的
Downloads > Windows 链接。
Windows版本是MSI文件格式,双击它即可开始安装。MSI文件格式允许Windows管理员使用标准工具自动
@@ -22,13 +24,13 @@ Python将安装到内含版本号信息的路径,例如Python 2.7版本将被
把默认使用的Python版本路径加到 :envvar:`PATH` 环境变量中,避免每次使用时都要冗余地写全Python
解释器路径。假设安装路径是 :file:`C:\\Python27\\`, 将这段加入到 :envvar:`PATH` 中:
-.. code-block:: console
+.. code-block:: doscon
C:\Python27\;C:\Python27\Scripts\
或在 ``powershell`` 中运行:
-.. code-block:: console
+.. code-block:: powershell
[Environment]::SetEnvironmentVariable("Path", "$env:Path;C:\Python27\;C:\Python27\Scripts\", "User")
@@ -38,10 +40,12 @@ Python将安装到内含版本号信息的路径,例如Python 2.7版本将被
就可以开始正式使用Python了,但我还是强烈建议各位,在正式开始Python应用开发前,安装接下来教程中所介绍
的工具和库。特别应该安装Setuptools——它将简化安装和使用Python第三方库的流程。
+
+****************
Setuptools + Pip
-----------------
+****************
-`setuptools `_ 和 `pip `_
+`setuptools `_ 和 `pip `_
是两个最重要的第三方Python包。
安装完成后,您可以使用单个命令下载、安装和卸载任何兼容的Python应用包。还可以轻松地这种网络安装的方式加入到自己开发
@@ -51,15 +55,16 @@ Python 2.7.9和更高版本(在Python 2系列上),Python 3.4和更高版
要查看是否安装了pip,请打开命令提示符并运行:
-.. code-block:: console
+.. code-block:: doscon
- $ command -v pip
+ command -v pip
要安装pip, `请遵照官方的pip安装指南 `_ —— 这将自动安装最新版本的setuptools。
+********************
虚拟环境
---------------------
+********************
虚拟环境工具(通常是指“virturalenv”)通过为不同项目创建专属的Python虚拟环境,以实现其依赖的库独立保存在不同的路径。
这解决了“项目X依赖包版本1.x,但项目Y依赖包版本为4.x”的难题, 并且维持全局的site-packages目录干净、易管理。
@@ -70,5 +75,5 @@ Python 2.7.9和更高版本(在Python 2系列上),Python 3.4和更高版
--------------------------------
-该页是 `另一份指南 `_ 的混合版本,可通过同一份许可获取。
+该页是 `另一份指南 `_ 的混合版本,可通过同一份许可获取。
diff --git a/docs/starting/install3/linux.rst b/docs/starting/install3/linux.rst
index 214657c..32859e1 100644
--- a/docs/starting/install3/linux.rst
+++ b/docs/starting/install3/linux.rst
@@ -1,11 +1,13 @@
.. _install3-linux:
+
+############################
在Linux上安装Python 3
-============================
+############################
.. image:: https://farm5.staticflickr.com/4276/34435689480_2e6f358510_k_d.jpg
-这份文档描述了如何在Ubuntu Linux机器上安装Python 3.6。
+这份文档描述了如何在Ubuntu Linux机器上安装Python 3.6 或 3.8。
想要获取已安装的Python 3版本号,可以通过终端运行命令:
@@ -18,12 +20,12 @@
$ sudo apt-get update
$ sudo apt-get install python3.6
-如果您使用的是其他版本的Ubuntu(比如LTS发行版),我们推荐使用 `deadsnakes PPA `_ 来安装 Python 3.6::
+如果您使用的是其他版本的Ubuntu(例如最新的 LTS 版本)或者您想使用更新的Python,我们建议使用 `deadsnakes PPA `_ 安装Python 3.8::
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:deadsnakes/ppa
$ sudo apt-get update
- $ sudo apt-get install python3.6
+ $ sudo apt-get install python3.8
如果您使用的是其他Linux发行版,有可能已经预装了Python 3。如果没有,使用发行版的包管理器。
比如,在Fedora上您可以使用 `dnf`:
@@ -33,33 +35,36 @@
$ sudo dnf install python3
注意,如果 ``python3`` 包的版本不够新,还有其他方式安装更新的版本,这取决于所在的发行版。
-比如在Fedora 25上安装 ``python36`` 包来获取Python 3.6。如果您是Fedora用户,您可能想
+比如在Fedora 32上安装 ``python3.9`` 包来获取Python 3.9。如果您是Fedora用户,您可能想
阅读 `Fedora中可用的多Python版本`_ 。
.. _Fedora中可用的多Python版本: https://developer.fedoraproject.org/tech/languages/python/multiple-pythons.html
+*********************
使用Python 3
----------------------
+*********************
-这个时候,在您系统上可能Python 2.7也是可用的。
+这个时候,在您系统上Python 2.7可能也是可用的。
.. code-block:: console
$ python
-将打开Python 2解释器。
+可能打开Python 2解释器。
.. code-block:: console
$ python3
-将打开Python 3解释器。
+将会打开Python 3解释器。
+
+****************
Setuptools & Pip
-----------------
+****************
-`setuptools `_ 和 `pip `_
+`setuptools `_ 和 `pip `_
是最重要的两个Python第三方软件包。一旦安装了它们,就可以通过一条指令下载、安装和卸载可获取到的
Python应用包,还可以轻松地将这种网络安装的方式加入到自己开发的Python应用中。
@@ -82,8 +87,9 @@ Python 2.7.9 以及之后版本(Python2 系列),和Python 3.4以及之后版
不过,使用虚拟环境(下面描述)就无需担心这个问题。
+*****************************
Pipenv & 虚拟环境
---------------------
+*****************************
下一步安装 Pipenv,然后就可以安装依赖关系并管理虚拟环境。
@@ -96,5 +102,5 @@ Pipenv & 虚拟环境
--------------------------------
-该页是 `另一份指南 `_ 的混合版本,可通过同一份许可获取。
+该页是 `另一份指南 `_ 的混合版本,可通过同一份许可获取。
diff --git a/docs/starting/install3/osx.rst b/docs/starting/install3/osx.rst
index afde0d5..043021a 100644
--- a/docs/starting/install3/osx.rst
+++ b/docs/starting/install3/osx.rst
@@ -2,47 +2,57 @@
.. _install3-osx:
+
+###############################
在Mac OS X上安装Python 3
-================================
+###############################
.. image:: https://farm5.staticflickr.com/4276/34435689480_2e6f358510_k_d.jpg
-最新版本的Mac OS X,High Sierra, **自带Python 2.7**。
+Mac OS X 自带 Python 2.7。
-您不必安装和配置即可直接使用Python 2。本教程用来说明Python 3的安装。
+不必安装和配置即可直接使用Python 2。本教程用来说明Python 3的安装。
OS X自带的Python版本更适合用于学习而不是开发。因为版本与Python官网发布的 `官方最新稳定版本
`_ 相比可能已经过时。
+
+**************
现在就开始吧!
---------------
+**************
跟着我一起安装真实版本的Python吧。
在正式安装之前,应先安装C编译器。最快的方式是运行 ``xcode-select --install`` 来安装Xcode命令行工具。
-您也可以从Mac应用商店下载完全版的 `XCode `_,
+您也可以从Mac应用商店下载完全版的 `Xcode `_,
或者更轻巧的 `OSX-GCC-Installer `_ 。
.. note::
- 如果已经安装了XCode,请不要再安装 OSX-GCC-Installer。两者结合可能会引发难以诊断的问题。
+ 如果已经安装了Xcode,请不要再安装 OSX-GCC-Installer。两者结合可能会引发难以诊断的问题。
.. note::
- 执行XCode的全新安装完成后,须在终端执行下述命令 ``xcode-select --install`` 来安装命令行工具。
+ 执行Xcode的全新安装完成后,须在终端执行下述命令 ``xcode-select --install`` 来安装命令行工具。
-尽管OS X系统附带了大量UNIX工具,熟悉Linux系统的人员使用时会发现缺少一个重要的组件——合适的包管理工具,
-`Homebrew `_ 正好填补了这个空缺。
+尽管OS X系统附带了大量Unix工具,熟悉Linux系统的人员使用时会发现缺少一个重要的组件——合适的包管理工具,
+`Homebrew `_ 正好填补了这个空缺。
-`安装 Homebrew