附录 A 安装及故障排除

    附录 A 安装及故障排除 - 图1
    Python 有很多版本,在各种操作系统中安装 Python 的方式也很多。如果第 1 章介绍的方式不管用,或者要安装非系统已有的 Python 版本,本附录可提供帮助。

    A.1 Windows 系统

    第 1 章介绍了如何使用 Python 网站提供的官方安装程序来安装 Python。如果执行安装程序后,无法运行 Python,本节的故障排除说明将帮助你让 Python 恢复正常。

    A.1.1 用 py 代替 python

    运行较新的 Python 安装程序后,如果在终端中执行命令 python,应该会看到表示终端会话的提示符(>>>)。

    如果不能识别命令 python,Windows 将认为没有安装 Python,进而打开 Microsoft Store 或显示一条消息(如“Python was not found”)。如果 Windows 打开了 Microsoft Store,请将其关闭。最好使用 Python 网站提供的官方安装程序,而不要使用 Microsoft 维护的安装程序。

    最简单的解决方案是,在不对系统做任何修改的情况下尝试执行命令 pypy 是 Windows 环境下的一个实用程序,它查找系统中安装的最新 Python 版本,并运行相应的解释器。如果这个命令管用,而且你愿意使用它,可将本书中所说的命令 pythonpython3 都替换为命令 py

    A.1.2 重新运行安装程序

    导致命令 python 不可用的最常见原因是,在运行安装程序时忘记选择复选框 Add Python to PATH,这是一种很容易犯的错误。变量 PATH 是一项系统设置,告诉 Windows 系统到哪里去查找常用的程序。如果没有选择复选框 Add Python to PATH,Windows 将不知道到哪里去查找 Python 解释器。

    在这种情况下,最简单的解决方案是再次运行安装程序。如果 Python 网站提供了更新的安装程序,请下载并运行它,同时务必选择复选框 Add Python to PATH。

    如果之前运行的就是最新的安装程序,请再次运行它并单击 Modify。你将看到一个可选特性(optional feature)列表,请保留默认设置并单击 Next 按钮,再选择复选框 Add Python to Environment Variables 并单击 Install 按钮。安装程序会知道 Python 已安装,因此只是将 Python 解释器的位置添加到变量 PATH 中。请务必关闭之前打开的终端窗口,因为它们使用的是之前的 PATH 变量。打开一个新的终端窗口,并执行命令 python,你将看到 Python 提示符(>>>)。

    A.2 macOS 系统

    在第 1 章的安装说明中,使用的是 Python 网站提供的安装程序。多年来,官方安装程序都很稳定,但有些因素可能导致你偏离正轨。如果遇到麻烦,可参阅本节提供的简单易行的解决方案。

    A.2.1 不小心安装了 Apple 提供的 Python 版本

    如果你在没有安装 Python 的系统中执行命令 python3,很可能出现一条消息,指出需要安装命令行开发者工具(command line developer tools)。在这种情况下,最佳做法是关闭显示这条消息的弹出窗口,从 Python 网站下载 Python 安装程序,再运行它。

    如果你在看到前述消息后选择安装命令行开发者工具,macOS 将在安装开发者工具的同时安装 Apple 提供的 Python 版本。问题是 Apple 提供的 Python 版本通常落后于官方提供的最新 Python 版本。不过即便你安装了 Apple 提供的 Python 版本,也可从 Python 网站下载官方安装程序并运行它,只是在这种情况下指向该版本的是命令 python3。因此,即便安装了开发者工具也不用担心,何况它还包含一些很有用的工具,如附录 D 将讨论的 Git 版本控制系统。

    A.2.2 较旧 macOS 系统中的 Python 2

    在较旧的 macOS 版本(Monterey 12.3 之前的版本)中,默认安装了已过时的 Python 2。在这些系统中,命令 python 指向的是 Python 2 解释器。如果你使用的是默认安装了 Python 2 的 macOS 版本,务必使用命令 python3,以便使用你自己安装的 Python 版本。

    A.3 Linux 系统

    几乎所有的 Linux 系统都默认安装了 Python,但如果自带的版本低于 Python 3.9,就需要安装最新的版本。如果你想使用最新的特性,如改进的错误消息,也可安装最新的版本。下面的说明适用于大多数基于 apt 的系统。

    A.3.1 使用默认安装的 Python

    如果要使用 python3 指向的 Python 版本,务必安装如下三个包:

    $ sudo apt install python3-dev python3-pip python3-venv

    这些包不仅提供了对开发人员来说很有用的工具,还提供了让你能够安装第三方包(如本书第二部分使用的第三方包)的工具。

    A.3.2 安装最新的 Python 版本

    使用名为 deadsnakes 的包能够轻松地安装多个 Python 版本。请执行如下命令:

    $ sudo add-apt-repository ppa:deadsnakes/ppa
    $
    sudo apt update
    $
    sudo apt install python3.11

    这些命令会在系统中安装 Python 3.11。

    要启动运行 Python 3.11 的终端会话,可执行如下命令:

    $ python3.11
    >>>

    每当在本书中看到命令 python 时,都将其替换为 python3.11。当从终端运行程序时,也请使用这个命令。

    为了充分发挥你安装的 Python 版本的威力,需要安装另外两个包:

    $ sudo apt install python3.11-dev python3.11-venv

    这些包包含在安装和运行第三方包(如本书第二部分使用的第三方包)时需要的模块。

    注意:长期以来,deadsnakes 包都得到了很好地维护。在更新的 Python 版本推出后,依然可使用上述命令,但需要将其中的 python3.11 替换为最新的 Python 版本。

    A.4 检查使用的是哪个版本

    如果在运行 Python 或安装额外的包的过程中遇到麻烦,知道使用的是哪个 Python 版本会很有帮助。你的系统中可能安装了多个 Python 版本,导致你不知道当前使用的是哪个版本。

    在这种情况下,可在终端窗口中执行如下命令:

    $ python —version
    Python 3.11.0

    输出准确地指出了命令 python 指向的是哪个版本。你也可以使用更简短的命令 python -V,输出与上述命令相同。

    A.5 Python 关键字和内置函数

    Python 包含一系列关键字和内置函数,在编程中命名时知道这些关键字和内置函数很重要:既不能使用 Python 关键字,也不应使用 Python 内置函数名,否则将覆盖相应的内置函数。

    本节将列出 Python 关键字和内置函数的名称,让你知道应避免哪些命名。

    A.5.1 Python 关键字

    下面的关键字都有特殊的含义,如果将它们用作变量名,将引发错误:

    False await else import pass
    None break except in raise
    True class finally is return
    and continue for lambda try
    as def from nonlocal while
    assert del global not with
    async elif if or yield

    A.5.2 Python 内置函数

    在将内置函数名用作变量名时,不会导致错误,但将覆盖这些函数的行为:

    abs() complex() hash() min() slice()
    aiter() delattr() help() next() sorted()
    all() dict() hex() object() staticmethod()
    any() dir() id() oct() str()
    anext() divmod() input() open() sum()
    ascii() enumerate() int() ord() super()
    bin() eval() isinstance() pow() tuple()
    bool() exec() issubclass() print() type()
    breakpoint() filter() iter() property() vars()
    bytearray() float() len() range() zip()
    bytes() format() list() repr() __import__()
    callable() frozenset() locals() reversed()
    chr() getattr() map() round()
    classmethod() globals() max() set()
    compile() hasattr() memoryview() setattr()