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 转到文件的开头或结尾。

  • 退格键删除键(或 C-d)删除上一个或下一个字符。

  • C-退格键C-删除键 向左或向右删除一个单词。

  • C-k 删除(“杀死”)右侧的所有内容。

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

自动缩进

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

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

搜索和替换

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

补全

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

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

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

在键入前缀后按 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 中经常使用的函数或执行导入常用模块的导入语句的便捷位置。

此外,如果存在,Tk 也会加载一个启动文件。请注意,Tk 文件是无条件加载的。此附加文件为 .Idle.py,并在用户的主目录中查找。此文件中的语句将在 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 无法导入标准库文件。当前的解决方法是重命名用户文件。

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

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

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

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

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

在 tcl/tk 版本低于 8.6.11 的基于 Unix 的系统上(请参阅 关于 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 的标准流替换不会被执行进程中创建的子进程继承,无论是直接由用户代码创建还是由多处理等模块创建。如果这些子进程使用来自 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 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)”时,环境不会重新启动。如果您的代码已被修改,则必须重新加载受影响的模块并重新导入任何特定的项(例如,从foo导入baz),更改才能生效。出于这些原因,如果可以,最好使用默认的子进程运行IDLE。

自版本 3.4 起已弃用。

帮助和首选项

帮助来源

“帮助”菜单项“IDLE 帮助”显示库参考中 IDLE 章节的格式化 html 版本。结果在一个只读的 tkinter 文本窗口中,与在 Web 浏览器中看到的内容非常相似。使用鼠标滚轮、滚动条或按住向上和向下箭头键来浏览文本。或者单击“目录”按钮,并在打开的框中选择一个节标题。

“帮助”菜单项“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

源代码: Lib/idlelib


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

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