IDLE

源代码: 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 删除(“杀死”)右侧的所有内容。

标准按键绑定(如 C-c 复制和 C-v 粘贴)可能有效。按键绑定在“配置 IDLE”对话框中选择。

自动缩进

在块打开语句后,下一行缩进 4 个空格(在 Python Shell 窗口中缩进一个制表符)。在某些关键字(break、return 等)后,下一行取消缩进。在领先缩进中,如果存在 Backspace,则最多删除 4 个空格。 Tab 插入空格(在 Python Shell 窗口中插入一个制表符),数量取决于缩进宽度。由于 Tcl/Tk 限制,当前制表符限制为四个空格。

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

搜索和替换

任何选择都会成为搜索目标。但是,只有行内的选择有效,因为搜索仅在删除终端换行符的行内执行。如果选中 [x] 常规 表达式,则根据 Python re 模块解释目标。

自动完成

在请求并可用时,会提供模块名称、类或函数的属性或文件名。每种请求方法都会显示一个包含现有名称的补全框。(有关例外,请参见下面的制表符补全。)对于任何框,通过键入和删除字符来更改正在补全的名称和框中突出显示的项;通过按 向上向下向上翻页向下翻页主页结束 键;以及通过在框内单击一次。使用 转义输入 和双击 制表符 键或在框外单击来关闭框。在框内双击可选择并关闭。

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

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

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

在字符串外部且没有前导“.”的情况下调用“显示补全”或在输入前缀后按 制表符,将打开一个包含关键字、内置名称和可用模块级名称的框。

在编辑器中编辑代码时(与 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 (C-pC-n 在 macOS 上) 将与已输入内容匹配的先前或下一个先前输入的语句检索到当前提示符。

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

文本颜色

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

IDLE 还会突出显示模式匹配语句中的 软关键字 matchcase_。但是,此突出显示并不完美,在某些罕见情况下会出现错误,包括 case 模式中的某些 _

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

启动和代码执行

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

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

命令行用法

idle.py [-c command] [-d] [-e] [-h] [-i] [-r file] [-s] [-t title] [-] [arg] ...

-c command  run command in the shell window
-d          enable debugger and open shell window
-e          open editor window
-h          print help message with legal combinations and exit
-i          open shell window
-r file     run file in shell window
-s          run $IDLESTARTUP or $PYTHONSTARTUP first, in shell window
-t title    set title of shell window
-           run stdin in shell (- must be last option before args)

如果有参数

  • 如果使用 --cr,所有参数都将放入 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.pytkinter.py。当此类文件位于即将运行的文件的同一目录中时,IDLE 无法导入 stdlib 文件。当前的修复方法是重命名用户文件。

虽然不如过去常见,但防病毒或防火墙程序可能会阻止连接。如果无法教导程序允许连接,则必须将其关闭才能使 IDLE 正常工作。允许此内部连接是安全的,因为外部端口上没有可见数据。类似的问题是阻止连接的网络配置错误。

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

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

当 IDLE 首次启动时,它会尝试读取 ~/.idlerc/ 中的用户配置文件(~ 是用户的主目录)。如果出现问题,应显示一条错误消息。抛开随机磁盘故障不谈,可以通过从不手动编辑文件来防止这种情况发生。相反,请使用“选项”下的配置对话框。一旦用户配置文件中出现错误,最好的解决办法可能是将其删除,并从设置对话框重新开始。

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

在 tcl/tk 早于 8.6.11 的基于 Unix 的系统上(请参阅 About IDLE),某些字体的某些字符会导致 tk 出现故障,并向终端发送一条消息。当用户启动 IDLE 编辑包含此类字符的文件时,或者稍后输入此类字符时,可能会发生这种情况。如果无法升级 tcl/tk,则重新配置 IDLE 以使用效果更好的字体。

运行用户代码

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

默认情况下,IDLE 在单独的操作系统进程中运行用户代码,而不是在运行 shell 和编辑器的用户界面进程中运行。在执行进程中,它将 sys.stdinsys.stdoutsys.stderr 替换为从 Shell 窗口获取输入并向其发送输出的对象。存储在 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 以减少附加堆栈帧的影响。

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

Shell 中的用户输出

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

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

Tk Text 小部件,因此 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 具有一个特殊功能,可将输出行压缩到“压缩文本”标签中。对于超过 N 行的输出,会自动执行此操作(默认情况下 N = 50)。可以在“设置”对话框的“常规”页面中的 PyShell 部分更改 N。可以通过右键单击输出来压缩行数较少的输出。这对于足够长以减慢滚动速度的行很有用。

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

开发 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。

如果使用 -n 命令行开关启动 IDLE,它将在单个进程中运行,并且不会创建运行 RPC Python 执行服务器的子进程。如果 Python 无法在您的平台上创建子进程或 RPC 套接字接口,这将很有用。但是,在这种模式下,用户代码与 IDLE 本身不是隔离的。此外,在选择运行/运行模块 (F5) 时,不会重新启动环境。如果您的代码已被修改,则必须重新加载受影响的模块并重新导入任何特定项(例如,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

在“系统偏好设置:Dock”下,可以将“打开文档时优先使用标签页”设置为“始终”。此设置与 IDLE 使用的 tk/tkinter GUI 框架不兼容,并且会破坏一些 IDLE 功能。

扩展

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

idlelib

源代码: Lib/idlelib


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

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