IDLE — Python 编辑器与 Shell

源代码: Lib/idlelib/


IDLE 是 Python 的集成开发和学习环境。

IDLE 具有以下特性:

  • 跨平台:在 Windows、Unix 和 macOS 上的工作方式基本相同

  • 带有代码输入、输出和错误消息高亮功能的 Python Shell 窗口(交互式解释器)

  • 多窗口文本编辑器,具有多次撤销、Python 语法高亮、智能缩进、调用提示、自动补全以及其他特性

  • 在任意窗口内搜索、在编辑器窗口内替换,以及在多个文件中搜索 (grep)

  • 带有持久断点、步进以及查看全局和局部命名空间的调试器

  • 配置、浏览器及其他对话框

编辑和导航

编辑器窗口

IDLE 启动时可能会打开编辑器窗口,具体取决于设置以及您如何启动 IDLE。之后,请使用“文件”菜单。对于给定的文件,只能有一个打开的编辑器窗口。

标题栏包含文件名、完整路径以及运行该窗口的 Python 和 IDLE 版本。状态栏包含行号(‘Ln’)和列号(‘Col’)。行号从 1 开始;列号从 0 开始。

IDLE 假设带有已知 .py* 扩展名的文件包含 Python 代码,而其他文件则不包含。使用“运行”菜单运行 Python 代码。

快捷键绑定

IDLE 插入光标是字符位置之间的一条细竖线。当输入字符时,插入光标及其右侧的所有内容向右移动一个字符,新字符在新的空间中输入。

一些非字符键可以移动光标并可能删除字符。删除不会将文本放入剪贴板,但 IDLE 有一个撤销列表。在本文档中讨论按键时,‘C’ 指的是 Windows 和 Unix 上的 Control 键,以及 macOS 上的 Command 键。(并且所有此类讨论都假定这些键没有被重新绑定到其他功能。)

  • 方向键可将光标移动一个字符或一行。

  • C-左箭头C-右箭头 可向左或向右移动一个单词。

  • HomeEnd 可转到行首或行尾。

  • Page UpPage Down 可向上或向下翻一屏。

  • C-HomeC-End 可转到文件开头或结尾。

  • BackspaceDel (或 C-d) 可删除前一个或后一个字符。

  • C-BackspaceC-Del 可向左或向右删除一个单词。

  • C-k 可删除(‘kill’)右侧的所有内容。

标准快捷键绑定(如 C-c 用于复制和 C-v 用于粘贴)可能会起作用。快捷键绑定在“配置 IDLE”对话框中选择。

自动缩进

在一个代码块开启语句之后,下一行会缩进4个空格(在 Python Shell 窗口中缩进一个制表符)。在某些关键字(break, return 等)之后,下一行会减少缩进。在行首缩进中,Backspace 会删除最多4个空格(如果存在)。Tab 会插入空格(在 Python Shell 窗口中是一个制表符),数量取决于缩进宽度。目前,由于 Tcl/Tk 的限制,制表符被限制为四个空格。

另请参阅 格式菜单 上的缩进/取消缩进区域命令。

搜索与替换

任何选定的内容都会成为搜索目标。但是,只有在单行内的选择才有效,因为搜索只在删除了末尾换行符的行内进行。如果勾选了 [x] 正则表达式,目标将根据 Python 的 re 模块进行解释。

代码补全

当请求并可用时,会为模块名、类或函数的属性或文件名提供代码补全。每种请求方法都会显示一个包含现有名称的补全框。(关于 Tab 补全,请参见下面的例外情况。)对于任何补全框,可以通过键入和删除字符;按 UpDownPageUpPageDownHomeEnd 键;以及在框内单击一次来更改正在补全的名称和框中高亮显示的项目。使用 EscapeEnter 和双击 Tab 键或在框外单击来关闭补全框。在框内双击会选择并关闭。

打开补全框的一种方法是键入一个关键字符并等待预定义的时间间隔。默认值为 2 秒;可以在设置对话框中自定义。(要防止自动弹出,请将延迟设置为一个很大的毫秒数,例如 100000000。)对于导入的模块名或类或函数属性,请键入‘.’。对于根目录中的文件名,请在开引号后立即键入 os.sepos.altsep。(在 Windows 上,可以先指定一个驱动器。)通过键入目录名和分隔符进入子目录。

可以不等待,或者在补全框关闭后,通过“编辑”菜单中的“显示补全”立即打开补全框。默认热键是 C-space。如果在打开补全框之前键入所需名称的前缀,第一个匹配或最接近的匹配项将变得可见。结果与在补全框显示后输入前缀相同。在引号后使用“显示补全”会补全当前目录中的文件名,而不是根目录。

在一个前缀后按 Tab 通常与“显示补全”有相同的效果。(没有前缀时,它会缩进。)但是,如果前缀只有一个匹配项,该匹配项会立即添加到编辑器文本中,而不会打开补全框。

在字符串之外且前面没有‘.’的情况下调用‘显示补全’或在前缀后按 Tab,会打开一个包含关键字、内置名称和可用模块级名称的补全框。

在编辑器(而不是 Shell)中编辑代码时,通过运行代码并且之后不重启 Shell,可以增加可用的模块级名称。这在文件顶部添加导入语句后尤其有用。这也会增加可能的属性补全。

补全框最初会排除以‘_’开头的名称,或者对于模块,不包含在‘__all__’中的名称。可以通过在‘.’之后输入‘_’来访问隐藏的名称,无论是在补全框打开之前还是之后。

调用提示

当在一个*可访问*函数名后输入 ( 时,会自动显示一个调用提示。函数名表达式可以包含点和下标。调用提示会一直显示,直到被点击、光标移出参数区域或输入 )。每当光标位于定义的参数部分时,选择“编辑”菜单中的“显示调用提示”或输入其快捷键,即可显示调用提示。

调用提示包括函数的签名及其文档字符串,直到后者的第一个空行或第五个非空行。(一些内置函数缺少可访问的签名。)签名中的‘/’或‘*’表示之前或之后的参数只能通过位置或名称(关键字)传递。细节可能会有变动。

在 Shell 中,可访问的函数取决于哪些模块已导入到用户进程中,包括由 IDLE 自身导入的模块,以及自上次重启以来运行了哪些定义。

例如,重启 Shell 并输入 itertools.count(。会出现一个调用提示,因为 IDLE 为了自身使用将 itertools 导入到了用户进程中。(这可能会改变。)输入 turtle.write(,则什么都不会出现。IDLE 本身不导入 turtle。菜单项和快捷键也无效。输入 import turtle。之后,turtle.write( 将会显示一个调用提示。

在编辑器中,导入语句在运行文件之前是无效的。你可能想在写完导入语句、添加函数定义或打开现有文件后运行文件。

代码上下文

在包含 Python 代码的编辑器窗口中,可以切换代码上下文以显示或隐藏窗口顶部的窗格。显示时,此窗格会冻结代码块的起始行,例如以 classdefif 关键字开头的行,这些行否则会滚动出视图。窗格的大小将根据需要扩展和收缩,以显示所有当前级别的上下文,最多显示在“配置 IDLE”对话框中定义的最大行数(默认为 15)。如果没有当前上下文行并且该功能已打开,将显示一个空白行。单击上下文窗格中的一行会将该行移动到编辑器的顶部。

上下文窗格的文本和背景颜色可以在“配置 IDLE”对话框的“高亮”选项卡下进行配置。

Shell 窗口

在 IDLE 的 Shell 中,可以输入、编辑和调用完整的语句。(大多数控制台和终端一次只能处理单个物理行)。

通过在光标位于行内任意位置按 Return 来提交单行语句以执行。如果一行用反斜杠 (\) 扩展,光标必须在最后一个物理行上。通过在多行复合语句后输入一个空行来提交该语句。

当您将代码粘贴到 Shell 中时,它不会被编译并可能执行,直到您按 Return,如上所述。您可以先编辑粘贴的代码。如果您将多个语句粘贴到 Shell 中,当多个语句被当作一个编译时,将导致 SyntaxError

包含 RESTART 的行意味着用户执行进程已经重启。这发生在用户执行进程崩溃、在 Shell 菜单上请求重启或在编辑器窗口中运行代码时。

在交互式输入代码时,前面小节描述的编辑功能都可用。IDLE 的 Shell 窗口还响应以下操作:

  • C-c 尝试中断语句执行(但可能失败)。

  • 如果在 >>> 提示符下键入 C-d,将关闭 Shell。

  • Alt-pAlt-n(在 macOS 上是 C-pC-n)将在当前提示符下检索与已键入内容匹配的前一个或后一个先前输入的语句。

  • 当光标位于任何先前的语句上时按 Return,会将该语句追加到提示符处已键入的任何内容之后。

文本颜色

IDLE 默认为白底黑字,但会为具有特殊含义的文本着色。对于 Shell,这些是 Shell 输出、Shell 错误、用户输出和用户错误。对于 Python 代码,无论是在 Shell 提示符下还是在编辑器中,这些是关键字、内置类和函数名、跟在 classdef 后面的名称、字符串和注释。对于任何文本窗口,这些是光标(如果存在)、找到的文本(如果可能)和选定的文本。

IDLE 还会高亮显示模式匹配语句中的软关键字 matchcase_。但是,这种高亮并不完美,在一些罕见情况下会不正确,包括 case 模式中的一些 _

文本着色是在后台完成的,所以偶尔会看到未着色的文本。要更改配色方案,请使用“配置 IDLE”对话框的“高亮”选项卡。编辑器中断点行的标记以及弹出窗口和对话框中的文本是用户不可配置的。

启动和代码执行

启动时如果带有 -s 选项,IDLE 将执行由环境变量 IDLESTARTUPPYTHONSTARTUP 引用的文件。IDLE 首先检查 IDLESTARTUP;如果 IDLESTARTUP 存在,则运行引用的文件。如果 IDLESTARTUP 不存在,IDLE 会检查 PYTHONSTARTUP。这些环境变量引用的文件是存储从 IDLE Shell 中频繁使用的函数或执行 import 语句以导入常用模块的方便之处。

此外,如果存在启动文件,Tk 也会加载它。请注意,Tk 文件是无条件加载的。这个额外的文件是 .Idle.py,并在用户的主目录中查找。此文件中的语句将在 Tk 命名空间中执行,因此该文件不适用于导入要在 IDLE 的 Python Shell 中使用的函数。

命令行用法

IDLE 可以通过命令行调用,并带有各种选项。通用语法是:

python -m idlelib [options] [file ...]

以下选项可用:

-c <command>

在 Shell 窗口中运行指定的 Python 命令。例如,传递 -c "print('Hello, World!')"。在 Windows 上,外层引号必须是双引号,如图所示。

-d

启用调试器并打开 Shell 窗口。

-e

打开一个编辑器窗口。

-h

打印一个带有合法选项组合的帮助消息并退出。

-i

打开一个 Shell 窗口。

-r <file>

在 Shell 窗口中运行指定的文件。

-s

在打开 Shell 窗口之前,运行启动文件(由环境变量 IDLESTARTUPPYTHONSTARTUP 定义)。

-t <title>

设置 Shell 窗口的标题。

-

在 Shell 窗口中读取并执行标准输入。此选项必须是任何参数之前的最后一个选项。

如果提供了参数:

  • 如果使用了 --c-r,所有参数都放在 sys.argv[1:] 中,并且 sys.argv[0] 分别设置为 '''-c''-r'。即使在*选项*对话框中设置了默认值,也不会打开编辑器窗口。

  • 否则,参数被视为要打开进行编辑的文件,并且 sys.argv 反映传递给 IDLE 本身的参数。

启动失败

IDLE 使用套接字在 IDLE GUI 进程和用户代码执行进程之间进行通信。每当 Shell 启动或重启时,都必须建立连接。(后者由一条写着‘RESTART’的分隔线表示)。如果用户进程无法连接到 GUI 进程,它通常会显示一个带有‘无法连接’消息的 Tk 错误框,并将用户引导到这里。然后它会退出。

Unix 系统上一种特定的连接失败是由于系统网络设置中某处配置不当的伪装规则造成的。当从终端启动 IDLE 时,您会看到一条以 ** Invalid host: 开头的消息。有效值是 127.0.0.1 (idlelib.rpc.LOCALHOST)。您可以在一个终端窗口中使用 tcpconnect -irv 127.0.0.1 6543 进行诊断,在另一个终端窗口中使用 tcplisten <same args>

一个常见的失败原因是用户编写的文件与标准库模块同名,例如 *random.py* 和 *tkinter.py*。当这样的文件与即将运行的文件位于同一目录时,IDLE 无法导入标准库文件。目前的解决方法是重命名用户文件。

虽然不如过去常见,但杀毒软件或防火墙程序可能会阻止连接。如果无法教会程序允许连接,那么必须将其关闭才能让 IDLE 工作。允许这种内部连接是安全的,因为在外部端口上看不到任何数据。类似的问题是阻止连接的网络配置错误。

Python 安装问题偶尔会阻止 IDLE:多个版本可能冲突,或者单个安装可能需要管理员权限。如果解决冲突,或者不能或不想以管理员身份运行,最简单的方法可能是完全移除 Python 并重新开始。

一个僵尸 pythonw.exe 进程可能是一个问题。在 Windows 上,使用任务管理器检查是否存在僵尸进程,如果存在则停止它。有时,由程序崩溃或键盘中断(control-C)引发的重启可能无法连接。关闭错误框或在 Shell 菜单上使用“重启 Shell”可能会修复临时问题。

当 IDLE 首次启动时,它会尝试读取 ~/.idlerc/ (~ 是您的主目录) 中的用户配置文件。如果出现问题,应该会显示一条错误消息。除了随机的磁盘故障,这可以通过从不手动编辑文件来避免。相反,请使用“选项”下的配置对话框。一旦用户配置文件出现错误,最好的解决方案可能是删除它,然后从设置对话框重新开始。

如果 IDLE 在没有消息的情况下退出,并且它不是从控制台启动的,请尝试从控制台或终端启动它(python -m idlelib),看看是否会产生错误消息。

在 tcl/tk 版本低于 8.6.11(请参阅 关于 IDLE)的基于 Unix 的系统上,某些字体的某些字符可能会导致 tk 失败,并向终端显示一条消息。这可能发生在启动 IDLE 编辑包含此类字符的文件时,或稍后输入此类字符时。如果您无法升级 tcl/tk,则重新配置 IDLE 以使用效果更好的字体。

运行用户代码

除了极少数例外,使用 IDLE 执行 Python 代码的结果旨在与默认方法(即直接在文本模式系统控制台或终端窗口中使用 Python 执行相同代码)相同。然而,不同的界面和操作偶尔会影响可见结果。例如,sys.modules 开始时条目更多,threading.active_count() 返回 2 而不是 1。

默认情况下,IDLE 在一个独立的操作系统进程中运行用户代码,而不是在运行 Shell 和编辑器的用户界面进程中。在执行进程中,它用从 Shell 窗口获取输入并向其发送输出的对象替换 sys.stdinsys.stdoutsys.stderr。存储在 sys.__stdin__sys.__stdout__sys.__stderr__ 中的原始值不会被触动,但可能是 None

将打印输出从一个进程发送到另一个进程中的文本小部件,比在同一进程中打印到系统终端要慢。这在打印多个参数时影响最大,因为每个参数的字符串、每个分隔符、换行符都是分开发送的。对于开发来说,这通常不是问题,但如果您想在 IDLE 中更快地打印,请格式化并连接所有您想一起显示的内容,然后打印一个单一的字符串。格式化字符串和 str.join() 都可以帮助组合字段和行。

IDLE 的标准流替换不会被执行进程中创建的子进程继承,无论是直接由用户代码创建还是由 multiprocessing 等模块创建。如果这些子进程使用来自 sys.stdin 的 input 或向 sys.stdout 或 sys.stderr 进行 printwrite,IDLE 应该在命令行窗口中启动。(在 Windows 上,使用 pythonpy 而不是 pythonwpyw。)次级子进程将被附加到该窗口以进行输入和输出。

如果用户代码重置了 sys,例如使用 importlib.reload(sys),IDLE 的更改将丢失,键盘输入和屏幕输出将无法正常工作。

当 Shell 具有焦点时,它控制键盘和屏幕。这通常是透明的,但直接访问键盘和屏幕的函数将不起作用。这些包括确定是否按下了某个键以及按下了哪个键的系统特定函数。

在执行进程中运行的 IDLE 代码会向调用堆栈添加一些本来不存在的帧。IDLE 包装了 sys.getrecursionlimitsys.setrecursionlimit 以减少额外堆栈帧的影响。

当用户代码直接或通过调用 sys.exit 引发 SystemExit 时,IDLE 会返回到 Shell 提示符而不是退出。

Shell 中的用户输出

当程序输出文本时,结果由相应的输出设备决定。当 IDLE 执行用户代码时,sys.stdoutsys.stderr 连接到 IDLE Shell 的显示区域。它的一些特性继承自底层的 Tk 文本小部件。其他的是编程添加的。在重要的地方,Shell 是为开发而非生产运行而设计的。

例如,Shell 从不丢弃输出。向 Shell 发送无限输出的程序最终会填满内存,导致内存错误。相比之下,一些系统文本窗口只保留最后 n 行输出。例如,Windows 控制台保留用户可设置的 1 到 9999 行,默认为 300。

一个 Tk 文本小部件,因此 IDLE 的 Shell,显示 Unicode 的 BMP(基本多文种平面)子集中的字符(码点)。哪些字符显示为正确的字形,哪些显示为替换框,取决于操作系统和安装的字体。制表符导致后面的文本在下一个制表位后开始。(它们每 8 个‘字符’出现一次)。换行符导致后面的文本出现在新的一行。其他控制字符被忽略或显示为空格、方框或其他东西,具体取决于操作系统和字体。(用方向键在这样的输出中移动文本光标可能会表现出一些令人惊讶的间距行为。)

>>> s = 'a\tb\a<\x02><\r>\bc\nd'  # Enter 22 chars.
>>> len(s)
14
>>> s  # Display repr(s)
'a\tb\x07<\x02><\r>\x08c\nd'
>>> print(s, end='')  # Display s as is.
# Result varies by OS and font.  Try it.

repr 函数用于表达式值的交互式回显。它返回输入字符串的修改版本,其中控制代码、一些 BMP 码点和所有非 BMP 码点都被替换为转义码。如上所示,它允许您识别字符串中的字符,而不管它们是如何显示的。

正常输出和错误输出通常与代码输入和彼此分开(在不同的行上)。它们各自获得不同的高亮颜色。

对于 SyntaxError 的回溯,正常的‘^’标记检测到错误的位置被替换为用错误高亮颜色标记文本。当从文件运行的代码导致其他异常时,您可以在回溯行上右键单击,跳转到 IDLE 编辑器中的相应行。如有必要,文件将被打开。

Shell 有一个特殊功能,可以将输出行压缩成一个“Squeezed text”标签。这对于超过 N 行(默认 N = 50)的输出是自动完成的。N 可以在设置对话框的“通用”页面的 PyShell 部分更改。行数较少的输出可以通过右键单击输出来压缩。这对于长到足以减慢滚动的行很有用。

压缩的输出可以通过双击标签在原地展开。也可以通过右键单击标签将其发送到剪贴板或单独的视图窗口。

开发 tkinter 应用程序

IDLE 有意与标准 Python 不同,以便于开发 tkinter 程序。在标准 Python 中输入 import tkinter as tk; root = tk.Tk(),什么都不会出现。在 IDLE 中输入相同的代码,会弹出一个 tk 窗口。在标准 Python 中,还必须输入 root.update() 才能看到窗口。IDLE 在后台执行等效操作,大约每秒 20 次,即大约每 50 毫秒一次。接下来输入 b = tk.Button(root, text='button'); b.pack()。同样,在标准 Python 中,直到输入 root.update() 之前,视觉上没有任何变化。

大多数 tkinter 程序运行 root.mainloop(),这通常在 tk 应用被销毁之前不会返回。如果程序是用 python -i 或从 IDLE 编辑器运行的,那么在 mainloop() 返回之前,不会出现 >>> shell 提示符,而此时已经没有什么可以交互的了。

当从 IDLE 编辑器运行 tkinter 程序时,可以注释掉 mainloop 调用。然后你会立即得到一个 shell 提示符,并可以与活动的应用程序交互。只需要记住在标准 Python 中运行时重新启用 mainloop 调用。

不使用子进程运行

默认情况下,IDLE 通过套接字在单独的子进程中执行用户代码,该套接字使用内部环回接口。此连接在外部不可见,不会向互联网发送或接收任何数据。如果防火墙软件仍然抱怨,你可以忽略它。

如果尝试建立套接字连接失败,Idle会通知您。这种失败有时是暂时的,但如果持续存在,问题可能是防火墙阻止了连接或特定系统的配置错误。在问题解决之前,可以使用 -n 命令行开关运行 Idle。

如果 IDLE 使用 -n 命令行开关启动,它将在单个进程中运行,并且不会创建运行 RPC Python 执行服务器的子进程。如果 Python 无法在您的平台上创建子进程或 RPC 套接字接口,这可能很有用。但是,在这种模式下,用户代码与 IDLE 本身没有隔离。此外,当选择“运行/运行模块 (F5)”时,环境不会重新启动。如果您的代码已修改,您必须 reload() 受影响的模块并重新导入任何特定的项(例如 from foo import baz),以便更改生效。由于这些原因,如果可能的话,最好使用默认的子进程运行 IDLE。

自 3.4 版起不建议使用。

帮助和首选项

帮助源

“帮助”菜单项“IDLE 帮助”显示了库参考中 IDLE 章节的格式化 HTML 版本。结果在一个只读的 tkinter 文本窗口中,与在 Web 浏览器中看到的非常接近。可以使用鼠标滚轮、滚动条或按住上下箭头键在文本中导航。或者点击 TOC (目录) 按钮,在打开的框中选择一个章节标题。

帮助菜单项“Python 文档”打开了位于 docs.python.org/x.y 的大量帮助资源,包括教程,其中‘x.y’是当前运行的 Python 版本。如果您的系统有离线文档副本(这可能是一个安装选项),则会打开该副本。

可以使用“配置 IDLE”对话框的“通用”选项卡随时在帮助菜单中添加或删除选定的 URL。

设置首选项

字体首选项、高亮显示、快捷键和常规首选项可以通过“选项”菜单上的“配置 IDLE”进行更改。非默认的用户设置保存在用户主目录下的 .idlerc 目录中。由错误的用户配置文件引起的问题可以通过编辑或删除 .idlerc 中的一个或多个文件来解决。

在“字体”选项卡上,查看文本示例以了解字体和大小对多种语言中多个字符的影响。编辑示例以添加个人感兴趣的其他字符。使用该示例选择等宽字体。如果特定字符在 Shell 或编辑器中有问题,请将它们添加到示例的顶部,并尝试先更改大小,然后更改字体。

在“高亮”和“按键”选项卡上,选择一个内置或自定义的颜色主题和按键集。要将较新的内置颜色主题或按键集与旧版 IDLE 一起使用,请将其另存为新的自定义主题或按键集,这样旧版 IDLE 就可以访问它。

macOS 上的 IDLE

在“系统偏好设置:程序坞”中,您可以将“打开文稿时首选标签页”设置为“始终”。此设置与 IDLE 使用的 tk/tkinter GUI 框架不兼容,并且会破坏一些 IDLE 功能。

扩展

IDLE 包含一个扩展功能。扩展的首选项可以在首选项对话框的“扩展”选项卡中更改。有关更多信息,请参阅 idlelib 目录中 config-extensions.def 的开头。当前唯一的默认扩展是 zzdummy,它也是一个用于测试的示例。

idlelib — IDLE 应用程序的实现

源代码: Lib/idlelib


Lib/idlelib 包实现了 IDLE 应用程序。有关如何使用 IDLE 的信息,请参阅本页的其余部分。

idlelib 中的文件在 idlelib/README.txt 中有描述。可以在 idlelib 中访问它,或者在 IDLE 菜单上单击“帮助”=>“关于 IDLE”。该文件还将 IDLE 菜单项映射到实现该项的代码。除了在“启动”下列出的文件外,idlelib 代码是“私有的”,意味着功能更改可以被向后移植(参见PEP 434)。