### 导航
- [索引](../genindex.xhtml "总目录")
- [模块](../py-modindex.xhtml "Python 模块索引") |
- [下一页](extending.xhtml "扩展/嵌入常见问题") |
- [上一页](design.xhtml "设计和历史常见问题") |
- ![](https://box.kancloud.cn/a721fc7ec672275e257bbbfde49a4d4e_16x16.png)
- [Python](https://www.python.org/) »
- zh\_CN 3.7.3 [文档](../index.xhtml) »
- [Python 常见问题](index.xhtml) »
- $('.inline-search').show(0); |
# [代码库和插件 FAQ](#id2)
目录
- [代码库和插件 FAQ](#library-and-extension-faq)
- [通用的代码库问题](#general-library-questions)
- [如何找到可以用来做 XXX 的模块或应用?](#how-do-i-find-a-module-or-application-to-perform-task-x)
- [math.py(socket.py,regex.py 等)的源文件在哪?](#where-is-the-math-py-socket-py-regex-py-etc-source-file)
- [在 Unix 中怎样让 Python 脚本可执行?](#how-do-i-make-a-python-script-executable-on-unix)
- [Python 中有 curses/termcap 包吗?](#is-there-a-curses-termcap-package-for-python)
- [Python 中存在类似 C 的 onexit() 函数的东西吗?](#is-there-an-equivalent-to-c-s-onexit-in-python)
- [为什么我的信号处理函数不能工作?](#why-don-t-my-signal-handlers-work)
- [通用任务](#common-tasks)
- [怎样测试 Python 程序或组件?](#how-do-i-test-a-python-program-or-component)
- [怎样用 docstring 创建文档?](#how-do-i-create-documentation-from-doc-strings)
- [怎样一次只获取一个按键?](#how-do-i-get-a-single-keypress-at-a-time)
- [线程相关](#threads)
- [程序中怎样使用线程?](#how-do-i-program-using-threads)
- [我的线程都没有运行,为什么?](#none-of-my-threads-seem-to-run-why)
- [如何将任务分配给多个工作线程?](#how-do-i-parcel-out-work-among-a-bunch-of-worker-threads)
- [怎样修改全局变量是线程安全的?](#what-kinds-of-global-value-mutation-are-thread-safe)
- [不能删除全局解释器锁吗?](#can-t-we-get-rid-of-the-global-interpreter-lock)
- [输入输出](#input-and-output)
- [怎样删除文件?(以及其他文件相关的问题……)](#how-do-i-delete-a-file-and-other-file-questions)
- [怎样复制文件?](#how-do-i-copy-a-file)
- [怎样读取(或写入)二进制数据?](#how-do-i-read-or-write-binary-data)
- [似乎 os.popen() 创建的管道不能使用 os.read(),这是为什么?](#i-can-t-seem-to-use-os-read-on-a-pipe-created-with-os-popen-why)
- [怎样访问(RS232)串口?](#how-do-i-access-the-serial-rs232-port)
- [为什么关闭 sys.stdout(stdin,stderr)并不会真正关掉它?](#why-doesn-t-closing-sys-stdout-stdin-stderr-really-close-it)
- [网络 / Internet 编程](#network-internet-programming)
- [Python 中的 WWW 工具是什么?](#what-www-tools-are-there-for-python)
- [怎样模拟发送 CGI 表单(METHOD=POST)?](#how-can-i-mimic-cgi-form-submission-method-post)
- [生成 HTML 需要使用什么模块?](#what-module-should-i-use-to-help-with-generating-html)
- [怎样使用 Python 脚本发送邮件?](#how-do-i-send-mail-from-a-python-script)
- [socket 的 connect() 方法怎样避免阻塞?](#how-do-i-avoid-blocking-in-the-connect-method-of-a-socket)
- [数据库](#databases)
- [Python 中有数据库包的接口吗?](#are-there-any-interfaces-to-database-packages-in-python)
- [在 Python 中如何实现持久化对象?](#how-do-you-implement-persistent-objects-in-python)
- [数学和数字](#mathematics-and-numerics)
- [Python 中怎样生成随机数?](#how-do-i-generate-random-numbers-in-python)
## [通用的代码库问题](#id3)
### [如何找到可以用来做 XXX 的模块或应用?](#id4)
在 [代码库参考](../library/index.xhtml#library-index) 中查找是否有适合的标准库模块。(如果你已经了解标准库的内容,可以跳过这一步)
对于第三方软件包,请搜索 [Python Package Index](https://pypi.org) \[https://pypi.org\] 或是 [Google](https://www.google.com) \[https://www.google.com\] 等其他搜索引擎。用“Python”加上一两个你需要的关键字通常会找到有用的东西。
### [math.py(socket.py,regex.py 等)的源文件在哪?](#id5)
如果找不到模块的源文件,可能它是一个内建的模块,或是使用 C,C++ 或其他编译型语言实现的动态加载模块。这种情况下可能是没有源码文件的,类似 `mathmodule.c` 这样的文件会存放在 C 代码目录中(但不在 Python 目录中)。
Python 中(至少)有三类模块:
1. 使用 Python 编写的模块(.py);
2. 使用 C 编写的动态加载模块(.dll,.pyd,.so,.sl 等);
3. 使用 C 编写并链接到解释器的模块,要获取此列表,输入:
```
import sys
print(sys.builtin_module_names)
```
### [在 Unix 中怎样让 Python 脚本可执行?](#id6)
你需要做两件事:文件必须是可执行的,并且第一行需要以 `#!` 开头,后面跟上 Python 解释器的路径。
第一点可以用执行 `chmod +x scriptfile` 或是 `chmod 755 scriptfile` 做到。
第二点有很多种做法,最直接的方式是:
```
#!/usr/local/bin/python
```
在文件第一行,使用你所在平台上的 Python 解释器的路径。
如果你希望脚本不依赖 Python 解释器的具体路径,你也可以使用 **env** 程序。假设你的 Python 解释器所在目录已经添加到了 `PATH` 环境变量中,几乎所有的类 Unix 系统都支持下面的写法:
```
#!/usr/bin/env python
```
*不要* 在 CGI 脚本中这样做。CGI 脚本的 `PATH` 环境变量通常会非常精简,所以你必须使用解释器的完整绝对路径。
有时候,用户的环境变量如果太长,可能会导致 **/usr/bin/env** 执行失败;又或者甚至根本就不存在 env 程序。在这种情况下,你可以尝试使用下面的 hack 方法(来自 Alex Rezinsky):
```
#! /bin/sh
""":"
exec python $0 ${1+"$@"}
"""
```
这样做有一个小小的缺点,它会定义脚本的 \_\_doc\_\_ 字符串。不过可以这样修复:
```
__doc__ = """...Whatever..."""
```
### [Python 中有 curses/termcap 包吗?](#id7)
对于类 Unix 系统:标准 Python 源码发行版会在 [Modules](https://github.com/python/cpython/tree/3.7/Modules) \[https://github.com/python/cpython/tree/3.7/Modules\] 子目录中附带 curses 模块,但默认并不会编译。(注意:在 Windows 平台下不可用 —— Windows 中没有 curses 模块。)
[`curses`](../library/curses.xhtml#module-curses "curses: An interface to the curses library, providing portable terminal handling. (Unix)") 模块支持基本的 curses 特性,同时也支持 ncurses 和 SYSV curses 中的很多额外功能,比如颜色、不同的字符集支持、填充和鼠标支持。这意味着这个模块不兼容只有 BSD curses 模块的操作系统,但是目前仍在维护的系统应该都不会存在这种情况。
对于 Windows 平台:使用 [consolelib 模块](http://effbot.org/zone/console-index.htm) \[http://effbot.org/zone/console-index.htm\].
### [Python 中存在类似 C 的 onexit() 函数的东西吗?](#id8)
[`atexit`](../library/atexit.xhtml#module-atexit "atexit: Register and execute cleanup functions.") 模块提供了一个与 C 的 `onexit()` 函数类似的注册函数。
### [为什么我的信号处理函数不能工作?](#id9)
最常见的问题是信号处理函数没有正确定义参数列表。它会被这样调用:
```
handler(signum, frame)
```
因此函数应该定义两个参数:
```
def handler(signum, frame):
...
```
## [通用任务](#id10)
### [怎样测试 Python 程序或组件?](#id11)
Python 带有两个测试框架。[`doctest`](../library/doctest.xhtml#module-doctest "doctest: Test pieces of code within docstrings.") 模块从模块的 docstring 中寻找示例并执行,对比输出是否与 docstring 中给出的是否一致。
[`unittest`](../library/unittest.xhtml#module-unittest "unittest: Unit testing framework for Python.") 模块是一个模仿 Java 和 Smalltalk 测试框架的更棒的测试框架。
为了使测试更容易,你应该在程序中使用良好的模块化设计。程序中的绝大多数功能都应该用函数或类方法封装 —— 有时这样做会有额外惊喜,程序会运行得更快(因为局部变量比全局变量访问要快)。除此之外,程序应该避免依赖可变的局部变量,这会使得测试困难许多。
程序的“全局主逻辑”应该尽量简单:
```
if __name__ == "__main__":
main_logic()
```
并放置在程序主模块的最后面。
一旦你的程序已经用函数和类完善地组织起来,你就应该编写测试函数来测试其行为。可以使用自动执行一系列测试函数的测试集与每个模块进行关联。听起来似乎需要大量的工作,但是因为 Python 非常简洁和灵活,所以实际上会相当简单。在编写“生产代码”的同时别忘了也要编写测试函数,你会发现编程会变得更愉快、更有趣,因为这样会使得发现 bug 和设计缺陷更加容易。
程序主模块之外的其他“辅助模块”中可以增加自测试的入口。
```
if __name__ == "__main__":
self_test()
```
通过使用 Python 实现的“假”接口,即使是需要与复杂的外部接口交互的程序也可以在外部接口不可用时进行测试。
### [怎样用 docstring 创建文档?](#id12)
[`pydoc`](../library/pydoc.xhtml#module-pydoc "pydoc: Documentation generator and online help system.") 模块可以用 Python 源码中的 docstring 创建 HTML 文件。也可以使用 [epydoc](http://epydoc.sourceforge.net/) \[http://epydoc.sourceforge.net/\] 来只通过 docstring 创建 API 文档。[Sphinx](http://sphinx-doc.org) \[http://sphinx-doc.org\] 也可以引入 docstring 的内容。
### [怎样一次只获取一个按键?](#id13)
在类 Unix 系统中有多种方案。最直接的方法是使用 curses,但是 curses 模块太大了,难以学习。
## [线程相关](#id14)
### [程序中怎样使用线程?](#id15)
一定要使用 [`threading`](../library/threading.xhtml#module-threading "threading: Thread-based parallelism.") 模块,不要使用 [`_thread`](../library/_thread.xhtml#module-_thread "_thread: Low-level threading API.") 模块。[`threading`](../library/threading.xhtml#module-threading "threading: Thread-based parallelism.") 模块对 [`_thread`](../library/_thread.xhtml#module-_thread "_thread: Low-level threading API.") 模块提供的底层线程原语做了更易用的抽象。
Aahz 的非常实用的 threading 教程中有一些幻灯片;可以参阅 <http://www.pythoncraft.com/OSCON2001/> 。
### [我的线程都没有运行,为什么?](#id16)
一旦主线程退出,所有的子线程都会被杀掉。你的主线程运行得太快了,子线程还没来得及工作。
简单的解决方法是在程序中加一个时间足够长的 sleep,让子线程能够完成运行。
```
import threading, time
def thread_task(name, n):
for i in range(n):
print(name, i)
for i in range(10):
T = threading.Thread(target=thread_task, args=(str(i), i))
T.start()
time.sleep(10) # <---------------------------!
```
但目前(在许多平台上)线程不是并行运行的,而是按顺序依次执行!原因是系统线程调度器在前一个线程阻塞之前不会启动新线程。
简单的解决方法是在运行函数的开始处加一个时间很短的 sleep。
```
def thread_task(name, n):
time.sleep(0.001) # <--------------------!
for i in range(n):
print(name, i)
for i in range(10):
T = threading.Thread(target=thread_task, args=(str(i), i))
T.start()
time.sleep(10)
```
比起用 [`time.sleep()`](../library/time.xhtml#time.sleep "time.sleep") 猜一个合适的等待时间,使用信号量机制会更好些。有一个办法是使用 [`queue`](../library/queue.xhtml#module-queue "queue: A synchronized queue class.") 模块创建一个 queue 对象,让每一个线程在运行结束时 append 一个令牌到 queue 对象中,主线程中从 queue 对象中读取与线程数量一致的令牌数量即可。
### [如何将任务分配给多个工作线程?](#id17)
最简单的方法是使用新的 [`concurrent.futures`](../library/concurrent.futures.xhtml#module-concurrent.futures "concurrent.futures: Execute computations concurrently using threads or processes.") 模块,尤其是其中的 [`ThreadPoolExecutor`](../library/concurrent.futures.xhtml#concurrent.futures.ThreadPoolExecutor "concurrent.futures.ThreadPoolExecutor") 类。
或者,如果你想更好地控制分发算法,你也可以自己写逻辑实现。使用 [`queue`](../library/queue.xhtml#module-queue "queue: A synchronized queue class.") 模块来创建任务列表队列。[`Queue`](../library/queue.xhtml#queue.Queue "queue.Queue") 类维护一个了一个存有对象的列表,提供了 `.put(obj)` 方法添加元素,并且可以用 `.get()` 方法获取元素。这个类会使用必要的加锁操作,以此确保每个任务只会执行一次。
这是一个简单的例子:
```
import threading, queue, time
# The worker thread gets jobs off the queue. When the queue is empty, it
# assumes there will be no more work and exits.
# (Realistically workers will run until terminated.)
def worker():
print('Running worker')
time.sleep(0.1)
while True:
try:
arg = q.get(block=False)
except queue.Empty:
print('Worker', threading.currentThread(), end=' ')
print('queue empty')
break
else:
print('Worker', threading.currentThread(), end=' ')
print('running with argument', arg)
time.sleep(0.5)
# Create queue
q = queue.Queue()
# Start a pool of 5 workers
for i in range(5):
t = threading.Thread(target=worker, name='worker %i' % (i+1))
t.start()
# Begin adding work to the queue
for i in range(50):
q.put(i)
# Give threads time to run
print('Main thread sleeping')
time.sleep(5)
```
运行时会产生如下输出:
```
Running worker
Running worker
Running worker
Running worker
Running worker
Main thread sleeping
Worker <Thread(worker 1, started 130283832797456)> running with argument 0
Worker <Thread(worker 2, started 130283824404752)> running with argument 1
Worker <Thread(worker 3, started 130283816012048)> running with argument 2
Worker <Thread(worker 4, started 130283807619344)> running with argument 3
Worker <Thread(worker 5, started 130283799226640)> running with argument 4
Worker <Thread(worker 1, started 130283832797456)> running with argument 5
...
```
查看模块的文档以获取更多信息;[`Queue`](../library/queue.xhtml#queue.Queue "queue.Queue") 类提供了多种接口。
### [怎样修改全局变量是线程安全的?](#id18)
Python VM 内部会使用 [global interpreter lock](../glossary.xhtml#term-global-interpreter-lock) (GIL)来确保同一时间只有一个线程运行。通常 Python 只会在字节码指令之间切换线程;切换的频率可以通过设置 [`sys.setswitchinterval()`](../library/sys.xhtml#sys.setswitchinterval "sys.setswitchinterval") 指定。从 Python 程序的角度来看,每一条字节码指令以及每一条指令对应的 C 代码实现都是原子的。
理论上说,具体的结果要看具体的 PVM 字节码实现对指令的解释。而实际上,对内建类型(int,list,dict 等)的共享变量的“类原子”操作都是原子的。
举例来说,下面的操作是原子的(L、L1、L2 是列表,D、D1、D2 是字典,x、y 是对象,i,j 是 int 变量):
```
L.append(x)
L1.extend(L2)
x = L[i]
x = L.pop()
L1[i:j] = L2
L.sort()
x = y
x.field = y
D[x] = y
D1.update(D2)
D.keys()
```
这些不是原子的:
```
i = i+1
L.append(L[-1])
L[i] = L[j]
D[x] = D[x] + 1
```
覆盖其他对象的操作会在其他对象的引用计数变成 0 时触发其 [`__del__()`](../reference/datamodel.xhtml#object.__del__ "object.__del__") 方法,这可能会产生一些影响。对字典和列表进行大量操作时尤其如此。如果有疑问的话,使用互斥锁!
### [不能删除全局解释器锁吗?](#id19)
[global interpreter lock](../glossary.xhtml#term-global-interpreter-lock) (GIL)通常被视为 Python 在高端多核服务器上开发时的阻力,因为(几乎)所有 Python 代码只有在获取到 GIL 时才能运行,所以多线程的 Python 程序只能有效地使用一个 CPU。
在 Python 1.5 时代,Greg Stein 开发了一个完整的补丁包(“free threadings” 补丁),移除了 GIL,并用粒度更合适的锁来代替。Adam Olsen 最近也在他的 [python-safethread](https://code.google.com/archive/p/python-safethread) \[https://code.google.com/archive/p/python-safethread\] 项目里做了类似的实验。不幸的是,由于为了移除 GIL 而使用了大量细粒度的锁,这两个实验在单线程测试中的性能都有明显的下降(至少慢 30%)。
但这并意味着你不能在多核机器上很好地使用 Python!你只需将任务划分为多\*进程\*,而不是多\*线程\*。新的 [`concurrent.futures`](../library/concurrent.futures.xhtml#module-concurrent.futures "concurrent.futures: Execute computations concurrently using threads or processes.") 模块中的 [`ProcessPoolExecutor`](../library/concurrent.futures.xhtml#concurrent.futures.ProcessPoolExecutor "concurrent.futures.ProcessPoolExecutor") 类提供了一个简单的方法;如果你想对任务分发做更多控制,可以使用 [`multiprocessing`](../library/multiprocessing.xhtml#module-multiprocessing "multiprocessing: Process-based parallelism.") 模块提供的底层 API。
恰当地使用 C 拓展也很有用;使用 C 拓展处理耗时较久的任务时,拓展可以在线程执行 C 代码时释放 GIL,让其他线程执行。[`zlib`](../library/zlib.xhtml#module-zlib "zlib: Low-level interface to compression and decompression routines compatible with gzip.") 和 [`hashlib`](../library/hashlib.xhtml#module-hashlib "hashlib: Secure hash and message digest algorithms.") 等标准库模块已经这样做了。
也有建议说 GIL 应该是解释器状态锁,而不是完全的全局锁;解释器不应该共享对象。不幸的是,这也不可能发生。由于目前许多对象的实现都有全局的状态,因此这是一个艰巨的工作。举例来说,小整型数和短字符串会缓存起来,这些缓存将不得不移动到解释器状态中。其他对象类型都有自己的自由变量列表,这些自由变量列表也必须移动到解释器状态中。等等。
我甚至怀疑这些工作是否可能在优先的时间内完成,因为同样的问题在第三方拓展中也会存在。第三方拓展编写的速度可比你将它们转换为把全局状态存入解释器状态中的速度快得多。
最后,假设多个解释器不共享任何状态,那么这样做比每个进程一个解释器好在哪里呢?
## [输入输出](#id20)
### [怎样删除文件?(以及其他文件相关的问题……)](#id21)
使用 `os.remove(filename)` 或 `os.unlink(filename)`。查看 [`os`](../library/os.xhtml#module-os "os: Miscellaneous operating system interfaces.") 模块以获取更多文档。这两个函数是一样的,[`unlink()`](../library/os.xhtml#os.unlink "os.unlink") 是这个函数在 Unix 系统调用中的名字。
如果要删除目录,应该使用 [`os.rmdir()`](../library/os.xhtml#os.rmdir "os.rmdir");使用 [`os.mkdir()`](../library/os.xhtml#os.mkdir "os.mkdir") 创建目录。`os.makedirs(path)` 会创建 `path` 中任何不存在的目录。`os.removedirs(path)` 则会删除其中的目录,只要它们都是空的;如果你想删除整个目录以及其中的内容,可以使用 [`shutil.rmtree()`](../library/shutil.xhtml#shutil.rmtree "shutil.rmtree")。
重命名文件可以使用 `os.rename(old_path, new_path)`。
如果需要截断文件,使用 `f = open(filename, "rb+")` 打开文件,然后使用 `f.truncate(offset)`;offset 默认是当前的搜索位置。也可以对使用 [`os.open()`](../library/os.xhtml#os.open "os.open") 打开的文件使用 `os.ftruncate(fd, offset)`,其中 *fd* 是文件描述符(一个小的整型数)。
[`shutil`](../library/shutil.xhtml#module-shutil "shutil: High-level file operations, including copying.") 模块也包含了一些处理文件的函数,包括 [`copyfile()`](../library/shutil.xhtml#shutil.copyfile "shutil.copyfile"),[`copytree()`](../library/shutil.xhtml#shutil.copytree "shutil.copytree") 和 [`rmtree()`](../library/shutil.xhtml#shutil.rmtree "shutil.rmtree")。
### [怎样复制文件?](#id22)
[`shutil`](../library/shutil.xhtml#module-shutil "shutil: High-level file operations, including copying.") 模块有一个 [`copyfile()`](../library/shutil.xhtml#shutil.copyfile "shutil.copyfile") 函数。注意在 MacOS 9 中不会复制 resource fork 和 Finder info。
### [怎样读取(或写入)二进制数据?](#id23)
要读写复杂的二进制数据格式,最好使用 [`struct`](../library/struct.xhtml#module-struct "struct: Interpret bytes as packed binary data.") 模块。该模块可以读取包含二进制数据(通常是数字)的字符串并转换为 Python 对象,反之亦然。
举例来说,下面的代码会从文件中以大端序格式读取一个 2 字节的整型和一个 4 字节的整型:
```
import struct
with open(filename, "rb") as f:
s = f.read(8)
x, y, z = struct.unpack(">hhl", s)
```
格式字符串中的 ‘>’ 强制以大端序读取数据;字母 ‘h’ 从字符串中读取一个“短整型”(2 字节),字母 ‘l’ 读取一个“长整型”(4 字节)。
对于更常规的数据(例如整型或浮点类型的列表),你也可以使用 [`array`](../library/array.xhtml#module-array "array: Space efficient arrays of uniformly typed numeric values.") 模块。
注解
要读写二进制数据的话,需要强制以二进制模式打开文件(这里为 [`open()`](../library/functions.xhtml#open "open") 函数传入 `"rb"`)。如果(默认)传入 `"r"` 的话,文件会以文本模式打开,`f.read()` 会返回 [`str`](../library/stdtypes.xhtml#str "str") 对象,而不是 [`bytes`](../library/stdtypes.xhtml#bytes "bytes") 对象。
### [似乎 os.popen() 创建的管道不能使用 os.read(),这是为什么?](#id24)
[`os.read()`](../library/os.xhtml#os.read "os.read") 是一个底层函数,它接收的是文件描述符 —— 用小整型数表示的打开的文件。[`os.popen()`](../library/os.xhtml#os.popen "os.popen") 创建的是一个高级文件对象,和内建的 [`open()`](../library/functions.xhtml#open "open") 方法返回的类型一样。因此,如果要从 [`os.popen()`](../library/os.xhtml#os.popen "os.popen") 创建的管道 *p* 中读取 *n* 个字节的话,你应该使用 `p.read(n)`。
### [怎样访问(RS232)串口?](#id25)
对于 Win32,POSIX(Linux,BSD 等),Jython:
> <http://pyserial.sourceforge.net>
对于 Unix,查看 Mitch Chapman 发布的帖子:
> <https://groups.google.com/groups?selm=34A04430.CF9@ohioee.com>
### [为什么关闭 sys.stdout(stdin,stderr)并不会真正关掉它?](#id26)
Python [文件对象](../glossary.xhtml#term-file-object) 是一个对底层 C 文件描述符的高层抽象。
对于在 Python 中通过内建的 [`open()`](../library/functions.xhtml#open "open") 函数创建的多数文件对象来说,`f.close()` 从 Python 的角度将其标记为已关闭,并且会关闭底层的 C 文件描述符。在 `f` 被垃圾回收的时候,析构函数中也会自动处理。
但由于 stdin,stdout 和 stderr 在 C 中的特殊地位,在 Python 中也会对它们做特殊处理。运行 `sys.stdout.close()` 会将 Python 的文件对象标记为已关闭,但是\*不会\*关闭与之关联的文件描述符。
要关闭这三者的 C 文件描述符的话,首先你应该确认确实需要关闭它(比如,这可能会影响到处理 I/O 的拓展)。如果确实需要这么做的话,使用 [`os.close()`](../library/os.xhtml#os.close "os.close"):
```
os.close(stdin.fileno())
os.close(stdout.fileno())
os.close(stderr.fileno())
```
或者也可以使用常量 0,1,2 代替。
## [网络 / Internet 编程](#id27)
### [Python 中的 WWW 工具是什么?](#id28)
参阅代码库参考手册中 [互联网协议和支持](../library/internet.xhtml#internet) 和 [互联网数据处理](../library/netdata.xhtml#netdata) 这两章的内容。Python 有大量模块来帮助你构建服务端和客户端 web 系统。
Paul Boddie 维护了一份可用框架的概览,见 <https://wiki.python.org/moin/WebProgramming> 。
Cameron Laird 维护了一份关于 Python web 技术的实用网页的集合,见 [http://phaseit.net/claird/comp.lang.python/web\_python](http://phaseit.net/claird/comp.lang.python/web_python) 。
### [怎样模拟发送 CGI 表单(METHOD=POST)?](#id29)
我需要通过 POST 表单获取网页,有什么代码能简单做到吗?
是的,这里有一个使用 urllib.request 的简单例子:
```
#!/usr/local/bin/python
import urllib.request
# build the query string
qs = "First=Josephine&MI=Q&Last=Public"
# connect and send the server a path
req = urllib.request.urlopen('http://www.some-server.out-there'
'/cgi-bin/some-cgi-script', data=qs)
with req:
msg, hdrs = req.read(), req.info()
```
注意,通常在百分号编码的 POST 操作中,查询字符串必须使用 [`urllib.parse.urlencode()`](../library/urllib.parse.xhtml#urllib.parse.urlencode "urllib.parse.urlencode") 处理一下。举个例子,如果要发送 `name=Guy Steele, Jr.` 的话:
```
>>> import urllib.parse
>>> urllib.parse.urlencode({'name': 'Guy Steele, Jr.'})
'name=Guy+Steele%2C+Jr.'
```
参见
查看 [如何使用urllib包获取网络资源](../howto/urllib2.xhtml#urllib-howto) 获取更多示例。
### [生成 HTML 需要使用什么模块?](#id30)
你可以在 [Web 编程 wiki 页面](https://wiki.python.org/moin/WebProgramming) \[https://wiki.python.org/moin/WebProgramming\] 找到许多有用的链接。
### [怎样使用 Python 脚本发送邮件?](#id31)
使用 [`smtplib`](../library/smtplib.xhtml#module-smtplib "smtplib: SMTP protocol client (requires sockets).") 标准库模块。
下面是一个很简单的交互式发送邮件的代码。这个方法适用于任何支持 SMTP 协议的主机。
```
import sys, smtplib
fromaddr = input("From: ")
toaddrs = input("To: ").split(',')
print("Enter message, end with ^D:")
msg = ''
while True:
line = sys.stdin.readline()
if not line:
break
msg += line
# The actual mail send
server = smtplib.SMTP('localhost')
server.sendmail(fromaddr, toaddrs, msg)
server.quit()
```
在 Unix 系统中还可以使用 sendmail。sendmail 程序的位置在不同系统中不一样,有时是在 `/usr/lib/sendmail`,有时是在 `/usr/sbin/sendmail`。sendmail 手册页面会对你有所帮助。以下是示例代码:
```
import os
SENDMAIL = "/usr/sbin/sendmail" # sendmail location
p = os.popen("%s -t -i" % SENDMAIL, "w")
p.write("To: receiver@example.com\n")
p.write("Subject: test\n")
p.write("\n") # blank line separating headers from body
p.write("Some text\n")
p.write("some more text\n")
sts = p.close()
if sts != 0:
print("Sendmail exit status", sts)
```
### [socket 的 connect() 方法怎样避免阻塞?](#id32)
通常会用 [`select`](../library/select.xhtml#module-select "select: Wait for I/O completion on multiple streams.") 模块处理 socket 异步 I/O。
要避免 TCP 连接阻塞,你可以设置将 socket 设置为非阻塞模式。此时当调用 `connect()` 时,要么连接会立刻建立好(几乎不可能),要么会收到一个包含了错误码 `.error` 的异常。`errno.EINPROGRESS` 表示连接正在进行,但还没有完成。不同的系统会返回不同的值,所以你需要确认你使用的系统会返回什么。
你可以使用 `connect_ex()` 方法来避免产生异常。这个方法只会返回错误码。如果需要轮询的话,你可以再次调用 `connect_ex()` —— `0` 或 `errno.EISCONN` 表示连接已建立,或者你也可以用 select 检查这个 socket 是否可写。
注解
[`asyncore`](../library/asyncore.xhtml#module-asyncore "asyncore: A base class for developing asynchronous socket handling services.") 模块提供了编写非阻塞网络代码框架性的方法。第三方的 [Twisted](https://twistedmatrix.com/trac/) \[https://twistedmatrix.com/trac/\] 库也很常用且功能强大。
## [数据库](#id33)
### [Python 中有数据库包的接口吗?](#id34)
当然。
标准 Python 还包含了基于磁盘的哈希接口例如 [`DBM`](../library/dbm.xhtml#module-dbm.ndbm "dbm.ndbm: The standard "database" interface, based on ndbm. (Unix)") 和 [`GDBM`](../library/dbm.xhtml#module-dbm.gnu "dbm.gnu: GNU's reinterpretation of dbm. (Unix)") 。除此之外还有 [`sqlite3`](../library/sqlite3.xhtml#module-sqlite3 "sqlite3: A DB-API 2.0 implementation using SQLite 3.x.") 模块,该模块提供了一个轻量级的基于磁盘的关系型数据库。
大多数关系型数据库都已经支持。查看 [数据库编程 wiki 页面](https://wiki.python.org/moin/DatabaseProgramming) \[https://wiki.python.org/moin/DatabaseProgramming\] 获取更多信息。
### [在 Python 中如何实现持久化对象?](#id35)
[`pickle`](../library/pickle.xhtml#module-pickle "pickle: Convert Python objects to streams of bytes and back.") 库模块以一种非常通用的方式解决了这个问题(虽然你依然不能用它保存打开的文件、套接字或窗口之类的东西),此外 [`shelve`](../library/shelve.xhtml#module-shelve "shelve: Python object persistence.") 库模块可使用 pickle 和 (g)dbm 来创建包含任意 Python 对象的持久化映射。
## [数学和数字](#id36)
### [Python 中怎样生成随机数?](#id37)
[`random`](../library/random.xhtml#module-random "random: Generate pseudo-random numbers with various common distributions.") 标准库模块实现了随机数生成器,使用起来非常简单:
```
import random
random.random()
```
这个函数会返回 \[0, 1) 之间的随机浮点数。
该模块中还有许多其他的专门的生成器,例如:
- `randrange(a, b)` 返回 \[a, b) 区间内的一个整型数。
- `uniform(a, b)` 返回 \[a, b) 区间之间的浮点数。
- `normalvariate(mean, sdev)` 使用正态(高斯)分布采样。
还有一些高级函数直接对序列进行操作,例如:
- `choice(S)` 从给定的序列中随机选择一个元素。
- `shuffle(L)` 对列表进行原地重排,也就是说随机打乱。
还有 `Random` 类,你可以将其实例化,用来创建多个独立的随机数生成器。
### 导航
- [索引](../genindex.xhtml "总目录")
- [模块](../py-modindex.xhtml "Python 模块索引") |
- [下一页](extending.xhtml "扩展/嵌入常见问题") |
- [上一页](design.xhtml "设计和历史常见问题") |
- ![](https://box.kancloud.cn/a721fc7ec672275e257bbbfde49a4d4e_16x16.png)
- [Python](https://www.python.org/) »
- zh\_CN 3.7.3 [文档](../index.xhtml) »
- [Python 常见问题](index.xhtml) »
- $('.inline-search').show(0); |
© [版权所有](../copyright.xhtml) 2001-2019, Python Software Foundation.
Python 软件基金会是一个非盈利组织。 [请捐助。](https://www.python.org/psf/donations/)
最后更新于 5月 21, 2019. [发现了问题](../bugs.xhtml)?
使用[Sphinx](http://sphinx.pocoo.org/)1.8.4 创建。
- Python文档内容
- Python 有什么新变化?
- Python 3.7 有什么新变化
- 摘要 - 发布重点
- 新的特性
- 其他语言特性修改
- 新增模块
- 改进的模块
- C API 的改变
- 构建的改变
- 性能优化
- 其他 CPython 实现的改变
- 已弃用的 Python 行为
- 已弃用的 Python 模块、函数和方法
- 已弃用的 C API 函数和类型
- 平台支持的移除
- API 与特性的移除
- 移除的模块
- Windows 专属的改变
- 移植到 Python 3.7
- Python 3.7.1 中的重要变化
- Python 3.7.2 中的重要变化
- Python 3.6 有什么新变化A
- 摘要 - 发布重点
- 新的特性
- 其他语言特性修改
- 新增模块
- 改进的模块
- 性能优化
- Build and C API Changes
- 其他改进
- 弃用
- 移除
- 移植到Python 3.6
- Python 3.6.2 中的重要变化
- Python 3.6.4 中的重要变化
- Python 3.6.5 中的重要变化
- Python 3.6.7 中的重要变化
- Python 3.5 有什么新变化
- 摘要 - 发布重点
- 新的特性
- 其他语言特性修改
- 新增模块
- 改进的模块
- Other module-level changes
- 性能优化
- Build and C API Changes
- 弃用
- 移除
- Porting to Python 3.5
- Notable changes in Python 3.5.4
- What's New In Python 3.4
- 摘要 - 发布重点
- 新的特性
- 新增模块
- 改进的模块
- CPython Implementation Changes
- 弃用
- 移除
- Porting to Python 3.4
- Changed in 3.4.3
- What's New In Python 3.3
- 摘要 - 发布重点
- PEP 405: Virtual Environments
- PEP 420: Implicit Namespace Packages
- PEP 3118: New memoryview implementation and buffer protocol documentation
- PEP 393: Flexible String Representation
- PEP 397: Python Launcher for Windows
- PEP 3151: Reworking the OS and IO exception hierarchy
- PEP 380: Syntax for Delegating to a Subgenerator
- PEP 409: Suppressing exception context
- PEP 414: Explicit Unicode literals
- PEP 3155: Qualified name for classes and functions
- PEP 412: Key-Sharing Dictionary
- PEP 362: Function Signature Object
- PEP 421: Adding sys.implementation
- Using importlib as the Implementation of Import
- 其他语言特性修改
- A Finer-Grained Import Lock
- Builtin functions and types
- 新增模块
- 改进的模块
- 性能优化
- Build and C API Changes
- 弃用
- Porting to Python 3.3
- What's New In Python 3.2
- PEP 384: Defining a Stable ABI
- PEP 389: Argparse Command Line Parsing Module
- PEP 391: Dictionary Based Configuration for Logging
- PEP 3148: The concurrent.futures module
- PEP 3147: PYC Repository Directories
- PEP 3149: ABI Version Tagged .so Files
- PEP 3333: Python Web Server Gateway Interface v1.0.1
- 其他语言特性修改
- New, Improved, and Deprecated Modules
- 多线程
- 性能优化
- Unicode
- Codecs
- 文档
- IDLE
- Code Repository
- Build and C API Changes
- Porting to Python 3.2
- What's New In Python 3.1
- PEP 372: Ordered Dictionaries
- PEP 378: Format Specifier for Thousands Separator
- 其他语言特性修改
- New, Improved, and Deprecated Modules
- 性能优化
- IDLE
- Build and C API Changes
- Porting to Python 3.1
- What's New In Python 3.0
- Common Stumbling Blocks
- Overview Of Syntax Changes
- Changes Already Present In Python 2.6
- Library Changes
- PEP 3101: A New Approach To String Formatting
- Changes To Exceptions
- Miscellaneous Other Changes
- Build and C API Changes
- 性能
- Porting To Python 3.0
- What's New in Python 2.7
- The Future for Python 2.x
- Changes to the Handling of Deprecation Warnings
- Python 3.1 Features
- PEP 372: Adding an Ordered Dictionary to collections
- PEP 378: Format Specifier for Thousands Separator
- PEP 389: The argparse Module for Parsing Command Lines
- PEP 391: Dictionary-Based Configuration For Logging
- PEP 3106: Dictionary Views
- PEP 3137: The memoryview Object
- 其他语言特性修改
- New and Improved Modules
- Build and C API Changes
- Other Changes and Fixes
- Porting to Python 2.7
- New Features Added to Python 2.7 Maintenance Releases
- Acknowledgements
- Python 2.6 有什么新变化
- Python 3.0
- Changes to the Development Process
- PEP 343: The 'with' statement
- PEP 366: Explicit Relative Imports From a Main Module
- PEP 370: Per-user site-packages Directory
- PEP 371: The multiprocessing Package
- PEP 3101: Advanced String Formatting
- PEP 3105: print As a Function
- PEP 3110: Exception-Handling Changes
- PEP 3112: Byte Literals
- PEP 3116: New I/O Library
- PEP 3118: Revised Buffer Protocol
- PEP 3119: Abstract Base Classes
- PEP 3127: Integer Literal Support and Syntax
- PEP 3129: Class Decorators
- PEP 3141: A Type Hierarchy for Numbers
- 其他语言特性修改
- New and Improved Modules
- Deprecations and Removals
- Build and C API Changes
- Porting to Python 2.6
- Acknowledgements
- What's New in Python 2.5
- PEP 308: Conditional Expressions
- PEP 309: Partial Function Application
- PEP 314: Metadata for Python Software Packages v1.1
- PEP 328: Absolute and Relative Imports
- PEP 338: Executing Modules as Scripts
- PEP 341: Unified try/except/finally
- PEP 342: New Generator Features
- PEP 343: The 'with' statement
- PEP 352: Exceptions as New-Style Classes
- PEP 353: Using ssize_t as the index type
- PEP 357: The 'index' method
- 其他语言特性修改
- New, Improved, and Removed Modules
- Build and C API Changes
- Porting to Python 2.5
- Acknowledgements
- What's New in Python 2.4
- PEP 218: Built-In Set Objects
- PEP 237: Unifying Long Integers and Integers
- PEP 289: Generator Expressions
- PEP 292: Simpler String Substitutions
- PEP 318: Decorators for Functions and Methods
- PEP 322: Reverse Iteration
- PEP 324: New subprocess Module
- PEP 327: Decimal Data Type
- PEP 328: Multi-line Imports
- PEP 331: Locale-Independent Float/String Conversions
- 其他语言特性修改
- New, Improved, and Deprecated Modules
- Build and C API Changes
- Porting to Python 2.4
- Acknowledgements
- What's New in Python 2.3
- PEP 218: A Standard Set Datatype
- PEP 255: Simple Generators
- PEP 263: Source Code Encodings
- PEP 273: Importing Modules from ZIP Archives
- PEP 277: Unicode file name support for Windows NT
- PEP 278: Universal Newline Support
- PEP 279: enumerate()
- PEP 282: The logging Package
- PEP 285: A Boolean Type
- PEP 293: Codec Error Handling Callbacks
- PEP 301: Package Index and Metadata for Distutils
- PEP 302: New Import Hooks
- PEP 305: Comma-separated Files
- PEP 307: Pickle Enhancements
- Extended Slices
- 其他语言特性修改
- New, Improved, and Deprecated Modules
- Pymalloc: A Specialized Object Allocator
- Build and C API Changes
- Other Changes and Fixes
- Porting to Python 2.3
- Acknowledgements
- What's New in Python 2.2
- 概述
- PEPs 252 and 253: Type and Class Changes
- PEP 234: Iterators
- PEP 255: Simple Generators
- PEP 237: Unifying Long Integers and Integers
- PEP 238: Changing the Division Operator
- Unicode Changes
- PEP 227: Nested Scopes
- New and Improved Modules
- Interpreter Changes and Fixes
- Other Changes and Fixes
- Acknowledgements
- What's New in Python 2.1
- 概述
- PEP 227: Nested Scopes
- PEP 236: future Directives
- PEP 207: Rich Comparisons
- PEP 230: Warning Framework
- PEP 229: New Build System
- PEP 205: Weak References
- PEP 232: Function Attributes
- PEP 235: Importing Modules on Case-Insensitive Platforms
- PEP 217: Interactive Display Hook
- PEP 208: New Coercion Model
- PEP 241: Metadata in Python Packages
- New and Improved Modules
- Other Changes and Fixes
- Acknowledgements
- What's New in Python 2.0
- 概述
- What About Python 1.6?
- New Development Process
- Unicode
- 列表推导式
- Augmented Assignment
- 字符串的方法
- Garbage Collection of Cycles
- Other Core Changes
- Porting to 2.0
- Extending/Embedding Changes
- Distutils: Making Modules Easy to Install
- XML Modules
- Module changes
- New modules
- IDLE Improvements
- Deleted and Deprecated Modules
- Acknowledgements
- 更新日志
- Python 下一版
- Python 3.7.3 最终版
- Python 3.7.3 发布候选版 1
- Python 3.7.2 最终版
- Python 3.7.2 发布候选版 1
- Python 3.7.1 最终版
- Python 3.7.1 RC 2版本
- Python 3.7.1 发布候选版 1
- Python 3.7.0 正式版
- Python 3.7.0 release candidate 1
- Python 3.7.0 beta 5
- Python 3.7.0 beta 4
- Python 3.7.0 beta 3
- Python 3.7.0 beta 2
- Python 3.7.0 beta 1
- Python 3.7.0 alpha 4
- Python 3.7.0 alpha 3
- Python 3.7.0 alpha 2
- Python 3.7.0 alpha 1
- Python 3.6.6 final
- Python 3.6.6 RC 1
- Python 3.6.5 final
- Python 3.6.5 release candidate 1
- Python 3.6.4 final
- Python 3.6.4 release candidate 1
- Python 3.6.3 final
- Python 3.6.3 release candidate 1
- Python 3.6.2 final
- Python 3.6.2 release candidate 2
- Python 3.6.2 release candidate 1
- Python 3.6.1 final
- Python 3.6.1 release candidate 1
- Python 3.6.0 final
- Python 3.6.0 release candidate 2
- Python 3.6.0 release candidate 1
- Python 3.6.0 beta 4
- Python 3.6.0 beta 3
- Python 3.6.0 beta 2
- Python 3.6.0 beta 1
- Python 3.6.0 alpha 4
- Python 3.6.0 alpha 3
- Python 3.6.0 alpha 2
- Python 3.6.0 alpha 1
- Python 3.5.5 final
- Python 3.5.5 release candidate 1
- Python 3.5.4 final
- Python 3.5.4 release candidate 1
- Python 3.5.3 final
- Python 3.5.3 release candidate 1
- Python 3.5.2 final
- Python 3.5.2 release candidate 1
- Python 3.5.1 final
- Python 3.5.1 release candidate 1
- Python 3.5.0 final
- Python 3.5.0 release candidate 4
- Python 3.5.0 release candidate 3
- Python 3.5.0 release candidate 2
- Python 3.5.0 release candidate 1
- Python 3.5.0 beta 4
- Python 3.5.0 beta 3
- Python 3.5.0 beta 2
- Python 3.5.0 beta 1
- Python 3.5.0 alpha 4
- Python 3.5.0 alpha 3
- Python 3.5.0 alpha 2
- Python 3.5.0 alpha 1
- Python 教程
- 课前甜点
- 使用 Python 解释器
- 调用解释器
- 解释器的运行环境
- Python 的非正式介绍
- Python 作为计算器使用
- 走向编程的第一步
- 其他流程控制工具
- if 语句
- for 语句
- range() 函数
- break 和 continue 语句,以及循环中的 else 子句
- pass 语句
- 定义函数
- 函数定义的更多形式
- 小插曲:编码风格
- 数据结构
- 列表的更多特性
- del 语句
- 元组和序列
- 集合
- 字典
- 循环的技巧
- 深入条件控制
- 序列和其它类型的比较
- 模块
- 有关模块的更多信息
- 标准模块
- dir() 函数
- 包
- 输入输出
- 更漂亮的输出格式
- 读写文件
- 错误和异常
- 语法错误
- 异常
- 处理异常
- 抛出异常
- 用户自定义异常
- 定义清理操作
- 预定义的清理操作
- 类
- 名称和对象
- Python 作用域和命名空间
- 初探类
- 补充说明
- 继承
- 私有变量
- 杂项说明
- 迭代器
- 生成器
- 生成器表达式
- 标准库简介
- 操作系统接口
- 文件通配符
- 命令行参数
- 错误输出重定向和程序终止
- 字符串模式匹配
- 数学
- 互联网访问
- 日期和时间
- 数据压缩
- 性能测量
- 质量控制
- 自带电池
- 标准库简介 —— 第二部分
- 格式化输出
- 模板
- 使用二进制数据记录格式
- 多线程
- 日志
- 弱引用
- 用于操作列表的工具
- 十进制浮点运算
- 虚拟环境和包
- 概述
- 创建虚拟环境
- 使用pip管理包
- 接下来?
- 交互式编辑和编辑历史
- Tab 补全和编辑历史
- 默认交互式解释器的替代品
- 浮点算术:争议和限制
- 表示性错误
- 附录
- 交互模式
- 安装和使用 Python
- 命令行与环境
- 命令行
- 环境变量
- 在Unix平台中使用Python
- 获取最新版本的Python
- 构建Python
- 与Python相关的路径和文件
- 杂项
- 编辑器和集成开发环境
- 在Windows上使用 Python
- 完整安装程序
- Microsoft Store包
- nuget.org 安装包
- 可嵌入的包
- 替代捆绑包
- 配置Python
- 适用于Windows的Python启动器
- 查找模块
- 附加模块
- 在Windows上编译Python
- 其他平台
- 在苹果系统上使用 Python
- 获取和安装 MacPython
- IDE
- 安装额外的 Python 包
- Mac 上的图形界面编程
- 在 Mac 上分发 Python 应用程序
- 其他资源
- Python 语言参考
- 概述
- 其他实现
- 标注
- 词法分析
- 行结构
- 其他形符
- 标识符和关键字
- 字面值
- 运算符
- 分隔符
- 数据模型
- 对象、值与类型
- 标准类型层级结构
- 特殊方法名称
- 协程
- 执行模型
- 程序的结构
- 命名与绑定
- 异常
- 导入系统
- importlib
- 包
- 搜索
- 加载
- 基于路径的查找器
- 替换标准导入系统
- Package Relative Imports
- 有关 main 的特殊事项
- 开放问题项
- 参考文献
- 表达式
- 算术转换
- 原子
- 原型
- await 表达式
- 幂运算符
- 一元算术和位运算
- 二元算术运算符
- 移位运算
- 二元位运算
- 比较运算
- 布尔运算
- 条件表达式
- lambda 表达式
- 表达式列表
- 求值顺序
- 运算符优先级
- 简单语句
- 表达式语句
- 赋值语句
- assert 语句
- pass 语句
- del 语句
- return 语句
- yield 语句
- raise 语句
- break 语句
- continue 语句
- import 语句
- global 语句
- nonlocal 语句
- 复合语句
- if 语句
- while 语句
- for 语句
- try 语句
- with 语句
- 函数定义
- 类定义
- 协程
- 最高层级组件
- 完整的 Python 程序
- 文件输入
- 交互式输入
- 表达式输入
- 完整的语法规范
- Python 标准库
- 概述
- 可用性注释
- 内置函数
- 内置常量
- 由 site 模块添加的常量
- 内置类型
- 逻辑值检测
- 布尔运算 — and, or, not
- 比较
- 数字类型 — int, float, complex
- 迭代器类型
- 序列类型 — list, tuple, range
- 文本序列类型 — str
- 二进制序列类型 — bytes, bytearray, memoryview
- 集合类型 — set, frozenset
- 映射类型 — dict
- 上下文管理器类型
- 其他内置类型
- 特殊属性
- 内置异常
- 基类
- 具体异常
- 警告
- 异常层次结构
- 文本处理服务
- string — 常见的字符串操作
- re — 正则表达式操作
- 模块 difflib 是一个计算差异的助手
- textwrap — Text wrapping and filling
- unicodedata — Unicode 数据库
- stringprep — Internet String Preparation
- readline — GNU readline interface
- rlcompleter — GNU readline的完成函数
- 二进制数据服务
- struct — Interpret bytes as packed binary data
- codecs — Codec registry and base classes
- 数据类型
- datetime — 基础日期/时间数据类型
- calendar — General calendar-related functions
- collections — 容器数据类型
- collections.abc — 容器的抽象基类
- heapq — 堆队列算法
- bisect — Array bisection algorithm
- array — Efficient arrays of numeric values
- weakref — 弱引用
- types — Dynamic type creation and names for built-in types
- copy — 浅层 (shallow) 和深层 (deep) 复制操作
- pprint — 数据美化输出
- reprlib — Alternate repr() implementation
- enum — Support for enumerations
- 数字和数学模块
- numbers — 数字的抽象基类
- math — 数学函数
- cmath — Mathematical functions for complex numbers
- decimal — 十进制定点和浮点运算
- fractions — 分数
- random — 生成伪随机数
- statistics — Mathematical statistics functions
- 函数式编程模块
- itertools — 为高效循环而创建迭代器的函数
- functools — 高阶函数和可调用对象上的操作
- operator — 标准运算符替代函数
- 文件和目录访问
- pathlib — 面向对象的文件系统路径
- os.path — 常见路径操作
- fileinput — Iterate over lines from multiple input streams
- stat — Interpreting stat() results
- filecmp — File and Directory Comparisons
- tempfile — Generate temporary files and directories
- glob — Unix style pathname pattern expansion
- fnmatch — Unix filename pattern matching
- linecache — Random access to text lines
- shutil — High-level file operations
- macpath — Mac OS 9 路径操作函数
- 数据持久化
- pickle —— Python 对象序列化
- copyreg — Register pickle support functions
- shelve — Python object persistence
- marshal — Internal Python object serialization
- dbm — Interfaces to Unix “databases”
- sqlite3 — SQLite 数据库 DB-API 2.0 接口模块
- 数据压缩和存档
- zlib — 与 gzip 兼容的压缩
- gzip — 对 gzip 格式的支持
- bz2 — 对 bzip2 压缩算法的支持
- lzma — 用 LZMA 算法压缩
- zipfile — 在 ZIP 归档中工作
- tarfile — Read and write tar archive files
- 文件格式
- csv — CSV 文件读写
- configparser — Configuration file parser
- netrc — netrc file processing
- xdrlib — Encode and decode XDR data
- plistlib — Generate and parse Mac OS X .plist files
- 加密服务
- hashlib — 安全哈希与消息摘要
- hmac — 基于密钥的消息验证
- secrets — Generate secure random numbers for managing secrets
- 通用操作系统服务
- os — 操作系统接口模块
- io — 处理流的核心工具
- time — 时间的访问和转换
- argparse — 命令行选项、参数和子命令解析器
- getopt — C-style parser for command line options
- 模块 logging — Python 的日志记录工具
- logging.config — 日志记录配置
- logging.handlers — Logging handlers
- getpass — 便携式密码输入工具
- curses — 终端字符单元显示的处理
- curses.textpad — Text input widget for curses programs
- curses.ascii — Utilities for ASCII characters
- curses.panel — A panel stack extension for curses
- platform — Access to underlying platform's identifying data
- errno — Standard errno system symbols
- ctypes — Python 的外部函数库
- 并发执行
- threading — 基于线程的并行
- multiprocessing — 基于进程的并行
- concurrent 包
- concurrent.futures — 启动并行任务
- subprocess — 子进程管理
- sched — 事件调度器
- queue — 一个同步的队列类
- _thread — 底层多线程 API
- _dummy_thread — _thread 的替代模块
- dummy_threading — 可直接替代 threading 模块。
- contextvars — Context Variables
- Context Variables
- Manual Context Management
- asyncio support
- 网络和进程间通信
- asyncio — 异步 I/O
- socket — 底层网络接口
- ssl — TLS/SSL wrapper for socket objects
- select — Waiting for I/O completion
- selectors — 高级 I/O 复用库
- asyncore — 异步socket处理器
- asynchat — 异步 socket 指令/响应 处理器
- signal — Set handlers for asynchronous events
- mmap — Memory-mapped file support
- 互联网数据处理
- email — 电子邮件与 MIME 处理包
- json — JSON 编码和解码器
- mailcap — Mailcap file handling
- mailbox — Manipulate mailboxes in various formats
- mimetypes — Map filenames to MIME types
- base64 — Base16, Base32, Base64, Base85 数据编码
- binhex — 对binhex4文件进行编码和解码
- binascii — 二进制和 ASCII 码互转
- quopri — Encode and decode MIME quoted-printable data
- uu — Encode and decode uuencode files
- 结构化标记处理工具
- html — 超文本标记语言支持
- html.parser — 简单的 HTML 和 XHTML 解析器
- html.entities — HTML 一般实体的定义
- XML处理模块
- xml.etree.ElementTree — The ElementTree XML API
- xml.dom — The Document Object Model API
- xml.dom.minidom — Minimal DOM implementation
- xml.dom.pulldom — Support for building partial DOM trees
- xml.sax — Support for SAX2 parsers
- xml.sax.handler — Base classes for SAX handlers
- xml.sax.saxutils — SAX Utilities
- xml.sax.xmlreader — Interface for XML parsers
- xml.parsers.expat — Fast XML parsing using Expat
- 互联网协议和支持
- webbrowser — 方便的Web浏览器控制器
- cgi — Common Gateway Interface support
- cgitb — Traceback manager for CGI scripts
- wsgiref — WSGI Utilities and Reference Implementation
- urllib — URL 处理模块
- urllib.request — 用于打开 URL 的可扩展库
- urllib.response — Response classes used by urllib
- urllib.parse — Parse URLs into components
- urllib.error — Exception classes raised by urllib.request
- urllib.robotparser — Parser for robots.txt
- http — HTTP 模块
- http.client — HTTP协议客户端
- ftplib — FTP protocol client
- poplib — POP3 protocol client
- imaplib — IMAP4 protocol client
- nntplib — NNTP protocol client
- smtplib —SMTP协议客户端
- smtpd — SMTP Server
- telnetlib — Telnet client
- uuid — UUID objects according to RFC 4122
- socketserver — A framework for network servers
- http.server — HTTP 服务器
- http.cookies — HTTP state management
- http.cookiejar — Cookie handling for HTTP clients
- xmlrpc — XMLRPC 服务端与客户端模块
- xmlrpc.client — XML-RPC client access
- xmlrpc.server — Basic XML-RPC servers
- ipaddress — IPv4/IPv6 manipulation library
- 多媒体服务
- audioop — Manipulate raw audio data
- aifc — Read and write AIFF and AIFC files
- sunau — 读写 Sun AU 文件
- wave — 读写WAV格式文件
- chunk — Read IFF chunked data
- colorsys — Conversions between color systems
- imghdr — 推测图像类型
- sndhdr — 推测声音文件的类型
- ossaudiodev — Access to OSS-compatible audio devices
- 国际化
- gettext — 多语种国际化服务
- locale — 国际化服务
- 程序框架
- turtle — 海龟绘图
- cmd — 支持面向行的命令解释器
- shlex — Simple lexical analysis
- Tk图形用户界面(GUI)
- tkinter — Tcl/Tk的Python接口
- tkinter.ttk — Tk themed widgets
- tkinter.tix — Extension widgets for Tk
- tkinter.scrolledtext — 滚动文字控件
- IDLE
- 其他图形用户界面(GUI)包
- 开发工具
- typing — 类型标注支持
- pydoc — Documentation generator and online help system
- doctest — Test interactive Python examples
- unittest — 单元测试框架
- unittest.mock — mock object library
- unittest.mock 上手指南
- 2to3 - 自动将 Python 2 代码转为 Python 3 代码
- test — Regression tests package for Python
- test.support — Utilities for the Python test suite
- test.support.script_helper — Utilities for the Python execution tests
- 调试和分析
- bdb — Debugger framework
- faulthandler — Dump the Python traceback
- pdb — The Python Debugger
- The Python Profilers
- timeit — 测量小代码片段的执行时间
- trace — Trace or track Python statement execution
- tracemalloc — Trace memory allocations
- 软件打包和分发
- distutils — 构建和安装 Python 模块
- ensurepip — Bootstrapping the pip installer
- venv — 创建虚拟环境
- zipapp — Manage executable Python zip archives
- Python运行时服务
- sys — 系统相关的参数和函数
- sysconfig — Provide access to Python's configuration information
- builtins — 内建对象
- main — 顶层脚本环境
- warnings — Warning control
- dataclasses — 数据类
- contextlib — Utilities for with-statement contexts
- abc — 抽象基类
- atexit — 退出处理器
- traceback — Print or retrieve a stack traceback
- future — Future 语句定义
- gc — 垃圾回收器接口
- inspect — 检查对象
- site — Site-specific configuration hook
- 自定义 Python 解释器
- code — Interpreter base classes
- codeop — Compile Python code
- 导入模块
- zipimport — Import modules from Zip archives
- pkgutil — Package extension utility
- modulefinder — 查找脚本使用的模块
- runpy — Locating and executing Python modules
- importlib — The implementation of import
- Python 语言服务
- parser — Access Python parse trees
- ast — 抽象语法树
- symtable — Access to the compiler's symbol tables
- symbol — 与 Python 解析树一起使用的常量
- token — 与Python解析树一起使用的常量
- keyword — 检验Python关键字
- tokenize — Tokenizer for Python source
- tabnanny — 模糊缩进检测
- pyclbr — Python class browser support
- py_compile — Compile Python source files
- compileall — Byte-compile Python libraries
- dis — Python 字节码反汇编器
- pickletools — Tools for pickle developers
- 杂项服务
- formatter — Generic output formatting
- Windows系统相关模块
- msilib — Read and write Microsoft Installer files
- msvcrt — Useful routines from the MS VC++ runtime
- winreg — Windows 注册表访问
- winsound — Sound-playing interface for Windows
- Unix 专有服务
- posix — The most common POSIX system calls
- pwd — 用户密码数据库
- spwd — The shadow password database
- grp — The group database
- crypt — Function to check Unix passwords
- termios — POSIX style tty control
- tty — 终端控制功能
- pty — Pseudo-terminal utilities
- fcntl — The fcntl and ioctl system calls
- pipes — Interface to shell pipelines
- resource — Resource usage information
- nis — Interface to Sun's NIS (Yellow Pages)
- Unix syslog 库例程
- 被取代的模块
- optparse — Parser for command line options
- imp — Access the import internals
- 未创建文档的模块
- 平台特定模块
- 扩展和嵌入 Python 解释器
- 推荐的第三方工具
- 不使用第三方工具创建扩展
- 使用 C 或 C++ 扩展 Python
- 自定义扩展类型:教程
- 定义扩展类型:已分类主题
- 构建C/C++扩展
- 在Windows平台编译C和C++扩展
- 在更大的应用程序中嵌入 CPython 运行时
- Embedding Python in Another Application
- Python/C API 参考手册
- 概述
- 代码标准
- 包含文件
- 有用的宏
- 对象、类型和引用计数
- 异常
- 嵌入Python
- 调试构建
- 稳定的应用程序二进制接口
- The Very High Level Layer
- Reference Counting
- 异常处理
- Printing and clearing
- 抛出异常
- Issuing warnings
- Querying the error indicator
- Signal Handling
- Exception Classes
- Exception Objects
- Unicode Exception Objects
- Recursion Control
- 标准异常
- 标准警告类别
- 工具
- 操作系统实用程序
- 系统功能
- 过程控制
- 导入模块
- Data marshalling support
- 语句解释及变量编译
- 字符串转换与格式化
- 反射
- 编解码器注册与支持功能
- 抽象对象层
- Object Protocol
- 数字协议
- Sequence Protocol
- Mapping Protocol
- 迭代器协议
- 缓冲协议
- Old Buffer Protocol
- 具体的对象层
- 基本对象
- 数值对象
- 序列对象
- 容器对象
- 函数对象
- 其他对象
- Initialization, Finalization, and Threads
- 在Python初始化之前
- 全局配置变量
- Initializing and finalizing the interpreter
- Process-wide parameters
- Thread State and the Global Interpreter Lock
- Sub-interpreter support
- Asynchronous Notifications
- Profiling and Tracing
- Advanced Debugger Support
- Thread Local Storage Support
- 内存管理
- 概述
- 原始内存接口
- Memory Interface
- 对象分配器
- 默认内存分配器
- Customize Memory Allocators
- The pymalloc allocator
- tracemalloc C API
- 示例
- 对象实现支持
- 在堆中分配对象
- Common Object Structures
- Type 对象
- Number Object Structures
- Mapping Object Structures
- Sequence Object Structures
- Buffer Object Structures
- Async Object Structures
- 使对象类型支持循环垃圾回收
- API 和 ABI 版本管理
- 分发 Python 模块
- 关键术语
- 开源许可与协作
- 安装工具
- 阅读指南
- 我该如何...?
- ...为我的项目选择一个名字?
- ...创建和分发二进制扩展?
- 安装 Python 模块
- 关键术语
- 基本使用
- 我应如何 ...?
- ... 在 Python 3.4 之前的 Python 版本中安装 pip ?
- ... 只为当前用户安装软件包?
- ... 安装科学计算类 Python 软件包?
- ... 使用并行安装的多个 Python 版本?
- 常见的安装问题
- 在 Linux 的系统 Python 版本上安装
- 未安装 pip
- 安装二进制编译扩展
- Python 常用指引
- 将 Python 2 代码迁移到 Python 3
- 简要说明
- 详情
- 将扩展模块移植到 Python 3
- 条件编译
- 对象API的更改
- 模块初始化和状态
- CObject 替换为 Capsule
- 其他选项
- Curses Programming with Python
- What is curses?
- Starting and ending a curses application
- Windows and Pads
- Displaying Text
- User Input
- For More Information
- 实现描述器
- 摘要
- 定义和简介
- 描述器协议
- 发起调用描述符
- 描述符示例
- Properties
- 函数和方法
- Static Methods and Class Methods
- 函数式编程指引
- 概述
- 迭代器
- 生成器表达式和列表推导式
- 生成器
- 内置函数
- itertools 模块
- The functools module
- Small functions and the lambda expression
- Revision History and Acknowledgements
- 引用文献
- 日志 HOWTO
- 日志基础教程
- 进阶日志教程
- 日志级别
- 有用的处理程序
- 记录日志中引发的异常
- 使用任意对象作为消息
- 优化
- 日志操作手册
- 在多个模块中使用日志
- 在多线程中使用日志
- 使用多个日志处理器和多种格式化
- 在多个地方记录日志
- 日志服务器配置示例
- 处理日志处理器的阻塞
- Sending and receiving logging events across a network
- Adding contextual information to your logging output
- Logging to a single file from multiple processes
- Using file rotation
- Use of alternative formatting styles
- Customizing LogRecord
- Subclassing QueueHandler - a ZeroMQ example
- Subclassing QueueListener - a ZeroMQ example
- An example dictionary-based configuration
- Using a rotator and namer to customize log rotation processing
- A more elaborate multiprocessing example
- Inserting a BOM into messages sent to a SysLogHandler
- Implementing structured logging
- Customizing handlers with dictConfig()
- Using particular formatting styles throughout your application
- Configuring filters with dictConfig()
- Customized exception formatting
- Speaking logging messages
- Buffering logging messages and outputting them conditionally
- Formatting times using UTC (GMT) via configuration
- Using a context manager for selective logging
- 正则表达式HOWTO
- 概述
- 简单模式
- 使用正则表达式
- 更多模式能力
- 修改字符串
- 常见问题
- 反馈
- 套接字编程指南
- 套接字
- 创建套接字
- 使用一个套接字
- 断开连接
- 非阻塞的套接字
- 排序指南
- 基本排序
- 关键函数
- Operator 模块函数
- 升序和降序
- 排序稳定性和排序复杂度
- 使用装饰-排序-去装饰的旧方法
- 使用 cmp 参数的旧方法
- 其它
- Unicode 指南
- Unicode 概述
- Python's Unicode Support
- Reading and Writing Unicode Data
- Acknowledgements
- 如何使用urllib包获取网络资源
- 概述
- Fetching URLs
- 处理异常
- info and geturl
- Openers and Handlers
- Basic Authentication
- Proxies
- Sockets and Layers
- 脚注
- Argparse 教程
- 概念
- 基础
- 位置参数介绍
- Introducing Optional arguments
- Combining Positional and Optional arguments
- Getting a little more advanced
- Conclusion
- ipaddress模块介绍
- 创建 Address/Network/Interface 对象
- 审查 Address/Network/Interface 对象
- Network 作为 Address 列表
- 比较
- 将IP地址与其他模块一起使用
- 实例创建失败时获取更多详细信息
- Argument Clinic How-To
- The Goals Of Argument Clinic
- Basic Concepts And Usage
- Converting Your First Function
- Advanced Topics
- 使用 DTrace 和 SystemTap 检测CPython
- Enabling the static markers
- Static DTrace probes
- Static SystemTap markers
- Available static markers
- SystemTap Tapsets
- 示例
- Python 常见问题
- Python常见问题
- 一般信息
- 现实世界中的 Python
- 编程常见问题
- 一般问题
- 核心语言
- 数字和字符串
- 性能
- 序列(元组/列表)
- 对象
- 模块
- 设计和历史常见问题
- 为什么Python使用缩进来分组语句?
- 为什么简单的算术运算得到奇怪的结果?
- 为什么浮点计算不准确?
- 为什么Python字符串是不可变的?
- 为什么必须在方法定义和调用中显式使用“self”?
- 为什么不能在表达式中赋值?
- 为什么Python对某些功能(例如list.index())使用方法来实现,而其他功能(例如len(List))使用函数实现?
- 为什么 join()是一个字符串方法而不是列表或元组方法?
- 异常有多快?
- 为什么Python中没有switch或case语句?
- 难道不能在解释器中模拟线程,而非得依赖特定于操作系统的线程实现吗?
- 为什么lambda表达式不能包含语句?
- 可以将Python编译为机器代码,C或其他语言吗?
- Python如何管理内存?
- 为什么CPython不使用更传统的垃圾回收方案?
- CPython退出时为什么不释放所有内存?
- 为什么有单独的元组和列表数据类型?
- 列表是如何在CPython中实现的?
- 字典是如何在CPython中实现的?
- 为什么字典key必须是不可变的?
- 为什么 list.sort() 没有返回排序列表?
- 如何在Python中指定和实施接口规范?
- 为什么没有goto?
- 为什么原始字符串(r-strings)不能以反斜杠结尾?
- 为什么Python没有属性赋值的“with”语句?
- 为什么 if/while/def/class语句需要冒号?
- 为什么Python在列表和元组的末尾允许使用逗号?
- 代码库和插件 FAQ
- 通用的代码库问题
- 通用任务
- 线程相关
- 输入输出
- 网络 / Internet 编程
- 数据库
- 数学和数字
- 扩展/嵌入常见问题
- 可以使用C语言中创建自己的函数吗?
- 可以使用C++语言中创建自己的函数吗?
- C很难写,有没有其他选择?
- 如何从C执行任意Python语句?
- 如何从C中评估任意Python表达式?
- 如何从Python对象中提取C的值?
- 如何使用Py_BuildValue()创建任意长度的元组?
- 如何从C调用对象的方法?
- 如何捕获PyErr_Print()(或打印到stdout / stderr的任何内容)的输出?
- 如何从C访问用Python编写的模块?
- 如何从Python接口到C ++对象?
- 我使用Setup文件添加了一个模块,为什么make失败了?
- 如何调试扩展?
- 我想在Linux系统上编译一个Python模块,但是缺少一些文件。为什么?
- 如何区分“输入不完整”和“输入无效”?
- 如何找到未定义的g++符号__builtin_new或__pure_virtual?
- 能否创建一个对象类,其中部分方法在C中实现,而其他方法在Python中实现(例如通过继承)?
- Python在Windows上的常见问题
- 我怎样在Windows下运行一个Python程序?
- 我怎么让 Python 脚本可执行?
- 为什么有时候 Python 程序会启动缓慢?
- 我怎样使用Python脚本制作可执行文件?
- *.pyd 文件和DLL文件相同吗?
- 我怎样将Python嵌入一个Windows程序?
- 如何让编辑器不要在我的 Python 源代码中插入 tab ?
- 如何在不阻塞的情况下检查按键?
- 图形用户界面(GUI)常见问题
- 图形界面常见问题
- Python 是否有平台无关的图形界面工具包?
- 有哪些Python的GUI工具是某个平台专用的?
- 有关Tkinter的问题
- “为什么我的电脑上安装了 Python ?”
- 什么是Python?
- 为什么我的电脑上安装了 Python ?
- 我能删除 Python 吗?
- 术语对照表
- 文档说明
- Python 文档贡献者
- 解决 Bug
- 文档错误
- 使用 Python 的错误追踪系统
- 开始为 Python 贡献您的知识
- 版权
- 历史和许可证
- 软件历史
- 访问Python或以其他方式使用Python的条款和条件
- Python 3.7.3 的 PSF 许可协议
- Python 2.0 的 BeOpen.com 许可协议
- Python 1.6.1 的 CNRI 许可协议
- Python 0.9.0 至 1.2 的 CWI 许可协议
- 集成软件的许可和认可
- Mersenne Twister
- 套接字
- Asynchronous socket services
- Cookie management
- Execution tracing
- UUencode and UUdecode functions
- XML Remote Procedure Calls
- test_epoll
- Select kqueue
- SipHash24
- strtod and dtoa
- OpenSSL
- expat
- libffi
- zlib
- cfuhash
- libmpdec