22.1. 升级 Python 2.x 到 3.x 版本须知

本部分包含有关从 Python2 更新到 Python3 的注释和技巧,包括每个模块中更改的摘要和参考。

参考

本部分中的注释基于Python开发团队和版本管理器针对每个发行版编写的*新增功能文档。

有关移植到 Python3 的更多信息,请参阅

新模块

Python3 包含许多新模块,提供了Python2 中没有的功能。

[asyncio](pymotw.com/3/asyncio/index.html#mo...“ asyncio:异步I / O,事件循环和并发工具”)

异步I / O,事件循环和其他并发工具

[concurrent.futures](pymotw.com/3/concurrent.futures/in...“ concurrent.futures:管理并发任务池”)

管理并发任务池

[ensurepip](pymotw.com/3/ensurepip/index.html#...“ ensurepip:安装Python软件包安装程序,pip”)

安装Python软件包安装程序pip

枚举

定义枚举类型

[ipaddress](pymotw.com/3/ipaddress/index.html#...“ ipaddress:用于处理Internet协议(IP)地址的类。”)

使用Internet协议(IP)地址的类

[pathlib](pymotw.com/3/pathlib/index.html#mo...“ pathlib:将文件系统路径视为对象。”)

面向对象的 API,用于处理文件系统路径

[选择器](pymotw.com/3/selectors/index.html#... / O复用抽象”)

I / O 复用抽象

[statistics](pymotw.com/3/statistics/index.html...“ statistics:统计计算”)

统计计算

[venv](pymotw.com/3/venv/index.html#modul...“ venv:创建隔离的安装和执行上下文。”)

创建隔离的安装和执行上下文

重命名模块

作为 PEP 3108 的一部分,许多标准库模块在 Python 2和3之间被重命名。所有新模块名称始终使用小写字母,并且其中一些已移入程序包以更好地组织相关模块。通常,仅通过修复 import 语句就可以将使用这些模块的代码更新为可与 Python 3配合使用。重命名的完整列表可以在字典lib2to3.fixes.fix_imports.MAPPING中找到(键是 Python 2名称,值是 Python 3名称)和下表中。

重命名模块

Python 2名称 Python 3名称
__ builtin __ builtins
_winreg winreg
BaseHTTPServer [http.server](pymotw.com/3/http.server/index.htm...“ http.server:用于实现Web服务器的基类。”)
CGIHTTPServer [http.server](pymotw.com/3/http.server/index.htm...“ http.server:用于实现Web服务器的基类。”)
命令 subprocess
ConfigParser [configparser](pymotw.com/3/configparser/index.ht...“ configparser:读取/写入类似于Windows INI文件的配置文件”)
饼干 [http.cookies](pymotw.com/3/http.cookies/index.ht...“ http.cookies:服务器端HTTP cookie工具”)
cookielib http.cookiejar
copy_reg copyreg
cPickle [pickle](pymotw.com/3/pickle/index.html#mod...“ pickle:对象序列化”)
cStringIO [io](pymotw.com/3/io/index.html#module-...“ io:实现文件I / O,并提供使用类文件API来处理缓冲区的类。 “)
dbhash dbm.bsd
dbm dbm.ndbm
对话框 tkinter.dialog
DocXMLRPCServer [xmlrpc.server](pymotw.com/3/xmlrpc.server/index.h...“ xmlrpc.server:实现XML-RPC服务器。”)
dumbdbm dbm.dumb
FileDialog tkinter.filedialog
gdbm dbm.gnu
htmlentitydefs html.entities
HTMLParser html.parser
httplib http.client
队列 队列
repr reprlib
robotparser [urllib.robotparser](pymotw.com/3/urllib.robotparser/in...“ urllib.robotparser:Internet蜘蛛访问控制”)
ScrolledText tkinter.scrolledtext
SimpleDialog tkinter.simpledialog
SimpleHTTPServer [http.server](pymotw.com/3/http.server/index.htm...“ http.server:用于实现Web服务器的基类。”)
SimpleXMLRPCServer [xmlrpc.server](pymotw.com/3/xmlrpc.server/index.h...“ xmlrpc.server:实现XML-RPC服务器。”)
SocketServer [socketserver](pymotw.com/3/socketserver/index.ht...“ socketserver:创建网络服务器。”)
StringIO [io](pymotw.com/3/io/index.html#module-...“ io:实现文件I / O,并提供使用类文件API来处理缓冲区的类。 “)
提示 tkinter.tix
tkColorChooser tkinter.colorchooser
tkCommonDialog tkinter.commondialog
Tkconstants tkinter.constants
Tkdnd tkinter.dnd
tkFileDialog tkinter.filedialog
tkFont tkinter.font
Tkinter tkinter
tkMessageBox tkinter.messagebox
tkSimpleDialog tkinter.simpledialog
ttk tkinter.ttk
urlparse [urllib.parse](pymotw.com/3/urllib.parse/index.ht...“ urllib.parse:将URL拆分为组件”)
UserList 集合
UserString 集合
xmlrpclib [xmlrpc.client](pymotw.com/3/xmlrpc.client/index.h...“ xmlrpc.client:XML-RPC的客户端库”)

也可以看看

-six软件包对于编写可同时在 Python 2和3下运行的代码很有用。特别是six.moves模块可让您的代码使用单个 import 语句导入重命名的模块,根据 Python 的版本自动将导入重定向到名称的正确版本。
- PEP 3108 –标准库重组

移除模块

这些模块不再存在,或者它们的功能被合并到现有模块中了。

bsddb

bsddb 和 dbm.bsd 模块被移除了。Berkeley DB 的绑定如今在标准库外作为 bsddb3 来维护。

commands

commands 模块从 Python 2.6 开始废弃,在 Python 3.0 中被移除。作为替代,查看 subprocess

compiler

compiler 模块被移除,作为替代,查看 ast

dircache

dircache 模块被移除,没有替代。

EasyDialogs

EasyDialogs 模块被移除,作为替代,查看 tkinter

exceptions

exceptions 模块被移除,由于所有的 exeptions 都可以作为内建类。

htmllib

htmllib 模块被移除,作为替代,查看  html.parser 。

md5

MD5消息摘要算法的实现被移动到了 hashlib

mimetools, MimeWriter, mimify, multifile, and rfc822

mimetoolsMimeWritermimifymultifile 和 rfc822这些模块被移除,作为替代,查看 email

popen2

popen2 模块被移除,作为替代,查看 subprocess

posixfile

posixfile 模块被移除,作为替代,查看 io

sets

sets 模块在 Python 2.6 中废弃,在 Python 3.0 中被移除。作为替代,使用 set 和 orderedset

sha

SHA-1 消息摘要算法被移动到 hashlib

sre

sre 模块在 Python 2.5 中废弃,在 Python 3.0 中被移除。作为替代,使用 re

statvfs

statvfs 模块在 Python 2.6 中废弃,在 Python 3.0 中被移除。作为替代,使用 os 中的 os.statvfs()

thread

thread 模块被移除。作为替代,使用 threading 中的更高级别的 API。

user

user 模块在 Python 2.6 中废弃,在 Python 3.0 中被移除。作为替代,查看 site 模块中提供的用户自定义功能。

废弃模块

这些模块仍然存在于标准库中,但是被废弃,并且不应该用在新的 Python 3 编程中。

asyncore and asynchat

异步 I/O 和协议处理。作为替代,查看 asyncio

formatter

通用输出格式和设备接口。查看 Python issue 18716 获取详情。

imp

访问 import 语句的实现。作为替代,查看 importlib

optparse

命令行选项解析库。argparse 的 API 类似于 optparse,并且在很多情况下,argparse 可被用作直接的替代,只需更新用到的类和方法的名称。

模块改动总结

abc

abstractproperty()abstractclassmethod() 以及 abstractstaticmethod() 被废弃。作为代替,结合 property()classmethod() 以及 staticmethod() 使用 abstractmethod(): (Python issue 11610).

anydbm

anydbm 在 Python 3 中被改名为 dbm

argparse

ArgumentParser 的 version 参数被移除,而使用了 action 方式 (Python issue 13248)。

旧的格式中, version 作为参数。

parser = argparse.ArgumentParser(version='1.0')

新的格式中,需要添加一个明确的参数定义。

parser = argparse.ArgumentParser()
parser.add_argument('--version', action='version',
version='%(prog)s 1.0')

选项名称和版本格式字符串可以被修改,来满足应用的需求。

Ptyhon 3.4 中,版本操作改为 stdout 而不是 stderr 来打印版本字符串: (Python issue 18920)。

array

Python 2 的早期版本中使用的代表字符字节的 'c' 类型被移除。作为替代,,使用 'b' 或者 'B'

代表 Unicode 字符串字符的 'u' 类型被废弃,在 Ptyhon 4.0 将被移除。

tostring() 和 fromstring() 函数被命名为 tobytes() 和 frombytes() 来消除歧义:(Python issue 8990)。

atexit

当 atexit 更新为包含一个 C 实现 (Python issue 1680961),一个回退被引入,在错误处理逻辑中,只有异常的概述出现,而没有回溯信息。Python 3.3 中修正了这个情况 (Python issue 18776)。

base64

encodestring() 和 decodestring() 改名为 encodebytes() 和 decodebytes() 旧的名字依然可以作为别名使用,但是被废弃了: (Python issue 3613)。

两个使用85字符字母表新的编码函数被添加。b85encode() 实现了用于 Mercurial 和 git 中的一个编码,而 a85encode() 实现了用于 PDF 文件 (Python issue 17618) 中的 Ascii85 格式。

bz2

BZ2File 示例现在支持上下文管理器协议,并且不需要被包含在 contextlib.closing() 中。

collections

之前定义在 collections 中的虚拟基类被移动到 collections.abc,具有 collections 中引入的后向兼容性,查看:(Python issue 11085)。

comands

getoutput() 和 getstatusoutput() 被移动到 subprocess, commands 被删除。

configparser

ConfigParser 模块被命名为 configparser

旧的 ConfigParser 由于 SafeConfigParser 被移除了,现在又被改名为 ConfigParser。废弃的插入文字操作可用通过 LegacyInterpolation 来实现。

read() 方法如今支持一个 encoding 参数,所以不再需要使用 codecs 来读取含有 Unicode 值的配置文件。

不建议使用 RawConfigParser。新项目应该使用 ConfigParser(interpolation=None) 来代替,可以得到同样的结果。

contextlib

contextlib.nested() 被移除。作为替代,向 with 语句传多个内容管理器。

csv

替代直接使用读取器的 next() 方法,使用内置的 next() 方法来合理引用 遍历器。

datetime

从 Python 3.3 开始,naive 和时区敏感的 datetime 实例之间的相等性比较,将会返回 False,而不是 TypeError (Python issue 15006)。

Python 3.5 之前,一个代表 midnight 的 datetime.time 对象在转换为布尔值时,等价于 False。这一情况在 Python 3.5 中被移除 (Python issue 13936)。

decimal

Python 3.3 基于 libmpdec 合并了 decimal 的一个 C 实现。这个改变提升了性能,但是相对于纯的 Python 实现,也带来了一些 API 变化,以及操作差别。查看 the Python 3.3 release notes 获取详情。

fractions

from_float() 和 from_decimal() 类方法不再需要。浮点数和 Decimal 值可以直接传给 Fraction 构造器。

gc

DEBUG_OBJECT 和 DEBUG_INSTANCE 标志被移除。不再需要辨别新旧类之间的区别。

gettext

gettext 中的所有翻译函数假定 Unicode 输入和输出,Unicode 变量例如 ugettext() 被移除。

glob

新函数 'escape()' 实现了一种查找名称中包含元字符的文件的方法 (Python issue 8402)。

http.cookies

除了转义引号之外,simplecokie 还在值中编码逗号和分号,以便更好地反映真实浏览器中的行为 (Python issue 9824)。

imaplib

Python 3 版本以下,imaplib 返回 UTF-8 编码的字节字符串。如今支持接受Unicode字符串,并在发送传出命令或作为登录服务器的用户名和密码时自动对其进行编码。

importlib

find_loader() 函数被废弃。作为替代,使用 importlib.util.find_spec()

inspect

getargspec()getfullargspec()
getargvalues()getcallargs()getargvalues()formatargspec() 以及 formatargvalues() 由于 signature() 被废弃 (Python issue 20438)。

itertools

imap()izip() 和 ifilter() 被返回迭代的内置函数版本替代,不再是 list 对象 (map()zip()filter:())。

ifilterfalse() 改名为 filterfalse()

json

json API 更新为只支持 str,并且没有 bytes,因为 JSON 只用 Unicode 进行定义。

locale

UTF-8 编码名称的规范化版本已从 「UTF8」 更改为 「UTF8」,因为 Mac OS X 和 OpenBSD 不支持使用 「UTF8」 (Python issue 10154 和 Python issue 10090)。

logging

logging 模块包含一个 lastResort logger,如果应用中没有其他日志配置则默认使用。这样就不需要在应用程序中单独配置日志记录,以避免用户在应用程序导入的库使用日志记录而应用程序本身不使用日志记录时看到错误消息。

mailbox

邮箱以二进制模式读取和写入邮箱文件,依赖电子邮件包解析邮件。不推荐使用StringIO和文本文件输入 (Python issue 9124)。

mmap

从读取 APIS 返回的值是字节字符串,在作为文本处理之前需要解码。

operator

div() 函数已被删除。根据所需的语义,使用 floordiv()truediv()

repeat() 函数已删除。改为使用 mul()

删除了功能 getslice()setslice()delslice()。改为将 getitem()setitem()delitem() 与切片索引一起使用。

函数 isCallable() 已被删除。使用抽象基类 collections.Callable 代替。

isinstance(obj, collections.Callable)

类型检查功能 isMappingType()isSequenceType()isNumberType() 已被删除。使用来自 collections 或 numbers 代替。

isinstance(obj, collections.Mapping)
isinstance(obj, collections.Sequence)
isinstance(obj, numbers.Number)

sequenceIncludes() 函数已被删除,改为使用 contains()

os

popen2()popen3()popen4() 已被移除。popen() 仍在但已被弃用并发出警告(如果使用)。使用这些功能的代码应重写为使用 subprocess ,而不是更多可跨操作系统移植。

os.tmpnam()os.tempnam()os.tmpfile() 已被删除。改为使用 tempfile 模块。

os.stat_float_times() 被废弃 (Python issue 14711)。

os.unsetenv() 不再忽略错误 (Python issue 13415)。

os.path

os.path.walk() 已被移除,使用 os.walk() 替代。

pdb

print 命令别名已被移除,不再会影响 print() 函数 (Python issue 18764)。保留 p 快捷方式。

pickle

Python 2 中的 pickle 模块的 C 实现已移至新模块,该模块将在可能时自动用于替换 Python 实现。不再需要在 pickle 之前查找 cPickle 的旧导入习惯。

try:
import cPickle as pickle
except:
import pickle

使用 C 实现的自动导入,仅需要直接导入 pickle 模块。

import pickle

针对使用2级或更低版本协议的 pickled 数据,改进了 Python 2.x 和 3.x 之间的互操作性,以解决在过渡到 Python 3 期间重命名大量标准库模块时引入的问题。因为 pickled 数据包括对类、类型名以及改动名的引用,很难在 Python 2 和 3 程序之间交换 pickled 数据。现在,对于使用协议级别2或更旧的协议进行 pickle 的数据,在向 pickle 流中进行写入和读取时,将自动使用类的旧名称。

此行为默认情况下可用,可以使用 fix_imports 选项关闭。此更改可以改善这种情况,但不能完全消除不兼容的情况。特别是在 Python 3.0 下,可能无法读取在 Python 3.1 下被 pickle 的数据。为了确保在 Python 3 应用程序之间具有最大的可移植性,请使用协议级别3,该协议级别不包括此兼容性功能。

默认协议版本已从人类可读的版本 0 更改为 3(在 Python 3 应用程序之间共享时具有最佳互操作性的二进制格式)。

当回读以创建 Unicode 字符串对象时,由 Python 2.x 应用程序写入 pickle 的字节字符串数据将被解码。转换的编码默认为 ASCII,可以通过将值传递给 Unpickler 进行更改。

pipes

pipes.quote() 已移至 shlex (Python issue 9723)。

platform

platform.popen() 已被启用,使用 subprocess.popen() 替代 (Python issue 11377)。

platform.uname() 现在返回一个 namedtuple

由于Linux发行版没有描述自己的一致方法,获取描述的方法 (platform.dist() 和 platform.linux_distribution()) 被废弃并且将在 Python 3.7 中移除 (Python issue 1322)。

random

jumpahead() 在 Python 3.0 中被移除。

re

默认为 UNICODE 标志位。要从 Python 2 沿用指定 ASCII,使用 ASCII 标志位。

shelve

shelve 的默认输出格式可以创建一个 .db 扩展名的文件,添加到传给 shelve.open() 的参数上。

signal

PEP 475 表示重试了中断的系统调用,并返回 EINTR。这会改变信号处理程序和其他系统调用的行为,因为在信号处理程序返回之后,除非信号处理程序引发异常,否则将重试中断的调用。有关完整的详细信息,请参考 PEP 文档。

socket

在 Python 2 中,通常可以直接通过套接字发送 str 对象。因为 str 替换了 unicode,所以在 Python 3 中必须先对值进行编码,然后再发送。socket 部分中的示例使用字节字符串,这些字符串已被编码。

socketserver

socketserver 在 Python 2中名称为 SocketServer

string

string 模块的所有函数,包括 str 对象的方法,都被移除了。

常量 letterslowercase 和 uppercase 被移除。名称相似的新常量仅限于 ASCII 字符集。

maketrans() 函数被 strbytesbytearray 上的函数代替,以阐明每种翻译表支持的输入类型。

struct

struct.pack() 现在仅在使用 s 字符串包代码时支持字节字符串,并且不再隐式将字符串对象编码为UTF-8 (Python issue 10783)。

subprocess

传给 subprocess.Popenclose_fds 参数默认值,不再总是 False。Unix 下总是默认为 True。在 Windows 下,如果标准 I/O 流参数设置为 None,那么默认为 True,否则默认为 False

sys

程序退出是,清除操作不再检查 sys.exitfunc 变量。使用 atexit 替代。

变量 sys.subversion 不再定义。

标志位 sys.flags.py3k_warningsys.flags.division_warningsys.flags.division_newsys.flags.tabcheck 和 sys.flags.unicode 不再定义。

变量 sys.maxint 不再定义。使用 sys.maxsize 替代。查看 PEP 237 (Unifying Long Integers and Integers).

全局异常跟踪变量 sys.exc_typesys.exc_value 和 sys.exc_traceback 被移除。函数 sys.exc_clear() 也被移除。

变量 sys.version_info 现在是一个 :pynamedtuple 实例,具有 majorminormicroreleaselevel 和 serial 属性 (Python issue 4285)。

检查间隔功能,控制允许线程上下文切换之前执行的操作码数已被替换为绝对时间值,由 sys.setswitchinterval() 管理。已弃用用于管理检查间隔的旧函数 sys.getcheckinterval() 和 sys.setcheckinterval()

现在,sys.meta_path 和 sys.path_hooks 变量公开了所有导入模块的路径查找器和入口钩子。在早期版本中,仅公开显式添加到路径的查找器和钩子,并且 C 导入在其实现中使用了无法从外部修改的值。

对于 Linux 系统,sys.platform 不再包含版本号。现在的值只是 linux 而不是 linux2 活 linux3

threading

弃用 thread 模块,使用 threading 中的 API。

threading 的调试功能包括从 APIs (Python issue 13550) 中移除掉的 verbose 变量。

threading 的较旧的实现将工厂函数用于某些类,因为它们在 C 中作为扩展类型实现,因此不能被子类化。语言的限制已被消除,许多旧的工厂函数已转换为允许子类化的标准类 (Python issue 10968)。

threading 导出的公共符号已重命名为 PEP 8 兼容。保留旧名称是为了向后兼容,但在将来的版本中将删除它们。

time

time.asctime() 和 time.ctime() 已重新实现为不使用同一时间的系统功能以允许使用更长的时间。time.ctime() 现在支持从1900到 maxint 的年份,尽管对于大于 9999 的值,输出字符串长于标准的24个字符,以允许多余的年份数字 (Python issue 8013)。

单元测试

不推荐使用以 「fail」 开头的 TestCase 方法 (failIf()failUnless()等)。请改用 assert 方法的替代形式。

不推荐使用几种较旧的方法别名,并用首选名称代替。使用不推荐使用的名称会产生警告 (Python issue 9424)。有关旧名称与新名称之间的映射,请参见下表。

Deprecated unittest.TestCase Methods

弃用名称 推荐名称
assert_() assertTrue()
assertEquals() assertEqual()
assertNotEquals() assertNotEqual()
assertAlmostEquals() assertAlmostEqual()
assertNotAlmostEquals() assertNotAlmostEqual()

UserDict, UserList, and UserString

UserDict、UserList 和 UserString 类已从其各自的模块移除到 collections 模块。可以直接将 dictlist 和 str 子类化,但是 collections 中的类可以简化子类的实现,因为容器的内容可以直接通过实例属性获得。collections.abc 中的抽象类对于创建遵循内置类型的 API 的自定义容器也很有用。

uuid

uuid.getnode() 现在使用 PATH 环境变量来查找可以报告 UNIX 下主机 MAC 地址的程序 (Python issue 19855)。如果在搜索路径上未找到程序,则回退到 /sbin 和 /usr/sbin 中。这个搜索行为可能会产生不同的结果,相对于早期的 Python 版本,如果是使用类似 netstatifconfigiparp 的话。

whichdb

whichdb 的功能已移至 dbm 模块。

xml.etree.ElementTree

XMLTreeBuilder 已重命名为 TreeBuilder并且 API 进行了几处更改。

ElementTree.getchildren() 被弃用,使用 list(elem) 建立子级列表。

ElementTree.getiterator() 被弃用,使用 iter() 代替常规迭代器协议来创建迭代器。

解析失败是,不是引发 xml.parsers.expat.ExpatErrorXMLParser 现在引发 xml.etree.ElementTree.ParseError

zipimport

从 get_data() 返回的数据是一个字节字符串,需要先解码才能用作 Unicode 字符串。