空闲 — Python 文档

来自菜鸟教程
Python/docs/3.9/library/idle
跳转至:导航、​搜索

空闲

源代码: :source:`库/空闲库/`



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

IDLE具有以下特点:

  • 100% 纯 Python 编码,使用 tkinter GUI 工具包
  • 跨平台:在 Windows、Unix 和 macOS 上的工作方式大致相同
  • 带有代码输入、输出和错误消息着色的 Python shell 窗口(交互式解释器)
  • 具有多个撤销、Python 着色、智能缩进、调用提示、自动完成和其他功能的多窗口文本编辑器
  • 在任何窗口中搜索,在编辑器窗口中替换,并搜索多个文件 (grep)
  • 具有持久断点、步进和查看全局和本地命名空间的调试器
  • 配置、浏览器和其他对话框

编辑和导航

编辑器窗口

IDLE 可能会在启动时打开编辑器窗口,具体取决于设置和您启动 IDLE 的方式。 此后,使用文件菜单。 给定文件只能有一个打开的编辑器窗口。

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

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


键绑定

在本节中,“C”指的是 Windows 和 Unix 上的 Control 键以及 macOS 上的 Command 键。

  • Backspace 向左删除; Del 向右删除

  • C-Backspace 删除左字; C-Del删除右边的字

  • 方向键和 Page Up/Page Down 左右移动

  • C-LeftArrowC-RightArrow 按单词移动

  • Home/End转到行首/行尾

  • C-Home/C-End 转到文件的开头/结尾

  • 一些有用的 Emacs 绑定是从 Tcl/Tk 继承的:

    • Ca 行首

    • Ce 行尾

    • Ck 终止线(但不将其放入剪贴板)

    • Cl 插入点周围的中心窗口

    • Cb 后退一个字符而不删除(通常您也可以使用光标键进行此操作)

    • Cf 向前移动一个字符而不删除(通常您也可以使用光标键进行此操作)

    • Cp 上一行(通常也可以使用光标键)

    • Cd 删除下一个字符


标准键绑定(如 Cc 复制和 Cv 粘贴)可能有效。 在“配置空闲”对话框中选择键绑定。


自动缩进

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

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


完成

在请求和可用时,为模块名称、类或函数的属性或文件名提供完成。 每个请求方法都显示一个带有现有名称的完成框。 (例外情况请参见下面的选项卡完成。)对于任何框,通过键入和删除字符来更改正在完成的名称和框中突出显示的项目; 通过点击 UpDownPageUpPageDownHome 和 End[X26X]钥匙; 并在框中单击一下。 使用 EscapeEnter 关闭框,然后双击 Tab 键或在框外单击。 在框中双击选择并关闭。

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

不要等待,或在框关闭后,立即使用“编辑”菜单上的“显示完成”打开完成框。 默认热键是 C-space。 如果在打开框之前键入所需名称的前缀,则可以看到第一个匹配项或未命中。 结果与在显示框后输入前缀相同。 在引用完成当前目录而不是根目录中的文件名后显示完成。

在前缀后点击 Tab 通常与 Show Completions 具有相同的效果。 (没有前缀,它会缩进。)但是,如果前缀只有一个匹配项,则该匹配项会立即添加到编辑器文本中,而无需打开框。

调用“Show Completions”,或在前缀之后、在字符串之外且没有前面的“.”时点击 Tab。 打开一个包含关键字、内置名称和可用模块级名称的框。

在编辑器中编辑代码时(与 Shell 相对),通过运行代码来增加可用的模块级名称,此后不要重新启动 Shell。 这在文件顶部添加导入后特别有用。 这也增加了可能的属性补全。

完成框最初排除以“_”开头的名称,或者对于模块,不包括在“__all__”中。 可以通过在打开框之前或之后在“.”之后键入“_”来访问隐藏名称。


提示

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

calltip 由函数的签名和文档字符串组成,直到后者的第一个空行或第五个非空行。 (某些内置函数缺少可访问的签名。)签名中的“/”或“*”表示前面或后面的参数仅按位置或名称(关键字)传递。 详细信息可能会发生变化。

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

例如重启Shell,输入itertools.count(。 出现调用提示是因为 Idle 将 itertools 导入用户进程供其自己使用。 (这可能会改变。)输入 turtle.write( 并且什么也没有出现。 空闲本身不导入乌龟。 菜单项和快捷方式也没有任何作用。 输入 import turtle。 此后,turtle.write( 将显示一个提示。

在编辑器中,导入语句在运行文件之前无效。 人们可能希望在编写导入语句之后、在添加函数定义之后或在打开现有文件之后运行文件。


代码上下文

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

上下文窗格的文本和背景颜色可以在 Configure IDLE 对话框的 Highlights 选项卡下配置。


Python Shell 窗口

使用 IDLE 的 Shell,您可以输入、编辑和调用完整的语句。 大多数控制台和终端一次只能使用一条物理线路。

当将代码粘贴到 Shell 中时,直到点击 Return 时,它才会被编译和执行。 可以先编辑粘贴的代码。 如果将多个语句粘贴到 Shell 中,那么当多条语句被编译为一条语句时,结果将是 SyntaxError

以交互方式输入代码时,前面小节中描述的编辑功能会起作用。 IDLE 的 Shell 窗口也会响应以下键。

  • Cc中断执行命令

  • Cd 发送文件尾; 如果在 >>> 提示符下键入,则关闭窗口

  • Alt-/(扩展词)对于减少打字也很有用

    命令历史

    • Alt-p 检索与您输入的内容匹配的先前命令。 在 macOS 上使用 Cp

    • Alt-n 检索下一个。 在 macOS 上使用 Cn

    • Return 在任何以前的命令上检索该命令


文字颜色

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

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


启动和代码执行

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

此外,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] 设置为 [ X113X]、'-c''-r'。 不会打开编辑器窗口,即使这是“选项”对话框中的默认设置。
  • 否则,参数是打开用于编辑的文件,sys.argv 反映传递给 IDLE 本身的参数。


启动失败

IDLE 使用套接字在 IDLE GUI 进程和用户代码执行进程之间进行通信。 每当 Shell 启动或重新启动时,都必须建立连接。 (后者由表示“重新启动”的分隔线指示)。 如果用户进程无法连接到 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(参见 About IDLE)的基于 Unix 的系统上,某些字体的某些字符会导致 tk 失败并向终端发送消息。 如果启动 IDLE 以编辑具有此类字符的文件或稍后输入此类字符,则可能会发生这种情况。 如果无法升级 tcl/tk,则重新配置 IDLE 以使用效果更好的字体。


运行用户代码

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

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

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

IDLE 的标准流替换不会被执行过程中创建的子进程继承,无论是直接由用户代码还是由多处理等模块。 如果此类子进程使用来自 sys.stdin 或 printwriteinput 到 sys.stdout 或 sys.stderr,则应在命令行窗口中启动 IDLE。 然后,辅助子进程将附加到该窗口以进行输入和输出。

如果 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 发送无限输出的程序最终会填满内存,从而导致内存错误。 相比之下,一些系统文本窗口只保留最后 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 回溯,检测到错误的正常 '^' 标记被替换为使用错误突出显示的文本着色。 当从文件运行的代码导致其他异常时,可以右键单击回溯行以跳转到空闲编辑器中的相应行。 如有必要,将打开该文件。

Shell 具有将输出行压缩为“压缩文本”标签的特殊工具。 对于 N 行(默认为 N = 50)的输出,这是自动完成的。 N 可以在 Settings 对话框的 General 页面的 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()。 同样,在进入 root.update() 之前,标准 Python 中没有任何明显变化。

大多数 tkinter 程序运行 root.mainloop(),通常在 tk 应用程序被销毁之前不会返回。 如果程序使用 python -i 或从 IDLE 编辑器运行,则在 mainloop() 返回之前不会出现 >>> shell 提示,此时没有任何可交互的内容。

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


在没有子进程的情况下运行

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

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

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

自 3.4 版起已弃用。


帮助和偏好

帮助来源

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

帮助菜单条目“Python Docs”打开了广泛的帮助来源,包括教程,可从 docs.python.org/x.y 获得,其中“x.y”是当前运行的 Python 版本。 如果您的系统有文档的离线副本(这可能是一个安装选项),则会打开该副本。

可以随时使用“配置空闲”对话框的“常规”选项卡从帮助菜单中添加或删除选定的 URL。


设置首选项

可以通过“选项”菜单上的“配置空闲”更改字体首选项、突出显示、键和一般首选项。 非默认用户设置保存在用户主目录的 .idlerc 目录中。 通过编辑或删除.idlerc中的一个或多个文件来解决由不良用户配置文件引起的问题。

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

在突出显示和键选项卡上,选择内置或自定义颜色主题和键集。 要在较旧的 IDLE 中使用较新的内置颜色主题或键集,请将其另存为新的自定义主题或键集,以便较旧的 IDLE 可以访问它。


在 macOS 上空闲

在 System Preferences: Dock 下,可以将“打开文档时首选选项卡”设置为“始终”。 此设置与 IDLE 使用的 tk/tkinter GUI 框架不兼容,并且它破坏了一些 IDLE 功能。


扩展

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