IDLE¶
源代码: Lib/idlelib/
IDLE 是 Python 的集成开发和学习环境。
IDLE 具有以下功能
跨平台:在 Windows、Unix 和 macOS 上的工作方式基本相同
Python Shell 窗口(交互式解释器),其中对代码输入、输出和错误消息进行着色
多窗口文本编辑器,具有多重撤消、Python 着色、智能缩进、调用提示、自动完成和其他功能
在任何窗口中搜索、在编辑器窗口中替换以及在多个文件中搜索(grep)
具有持久断点、步进以及查看全局和局部命名空间的调试器
配置、浏览器和其他对话框
启动和代码执行¶
使用 -s
选项启动时,IDLE 将执行环境变量 IDLESTARTUP
或 PYTHONSTARTUP
引用的文件。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)
如果有参数
如果使用
-
、-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 无法导入 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.stdin
、sys.stdout
和 sys.stderr
替换为从 Shell 窗口获取输入并向其发送输出的对象。存储在 sys.__stdin__
、sys.__stdout__
和 sys.__stderr__
中的原始值不受影响,但可能是 None
。
将一个进程中的打印输出发送到另一个进程中的文本小部件比在同一进程中打印到系统终端要慢。当打印多个参数时,这种影响最为明显,因为每个参数的字符串、每个分隔符和换行符都是单独发送的。对于开发而言,这通常不是问题,但如果要在 IDLE 中更快地打印,请对要一起显示的所有内容进行格式化和连接,然后打印一个字符串。格式化字符串和 str.join()
都可以帮助合并字段和行。
IDLE 的标准流替换不会被执行进程中创建的子进程继承,无论是由用户代码直接创建还是由 multiprocessing 等模块创建。如果此类子进程从 sys.stdin 使用 input
或向 sys.stdout 或 sys.stderr print
或 write
,则应在命令行窗口中启动 IDLE。(在 Windows 上,请使用 python
或 py
,而不是 pythonw
或 pyw
。)然后,辅助子进程将附加到该窗口以进行输入和输出。
如果 sys
被用户代码重置,例如使用 importlib.reload(sys)
,则 IDLE 的更改将丢失,并且从键盘输入和向屏幕输出将无法正常工作。
当 Shell 具有焦点时,它控制键盘和屏幕。这通常是透明的,但直接访问键盘和屏幕的函数将不起作用。其中包括确定是否已按下某个键(如果是,则确定哪个键)的特定于系统的函数。
在执行过程中运行的 IDLE 代码会向调用堆栈添加一些原本不存在的帧。IDLE 封装了 sys.getrecursionlimit
和 sys.setrecursionlimit
以减少附加堆栈帧的影响。
当用户代码直接引发 SystemExit 或通过调用 sys.exit 引发 SystemExit 时,IDLE 会返回到 Shell 提示符,而不是退出。
Shell 中的用户输出¶
当程序输出文本时,结果由相应的输出设备决定。当 IDLE 执行用户代码时,sys.stdout
和 sys.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)。