2.2. 解释器及其环境
2.2.1. 错误处理
有错误发生时, 解释器会输出错误信息和栈跟踪. 交互模式下, 它返回到主提示符, 如果从文件输入执行, 它在打印栈跟踪后以非零状态退出. (在 try
语句中抛出并被 except
从句处理的异常不是这里所讲的错误). 一些非常致命的错误会导致非零状态下退出, 这通常由内部问题或内存溢出造成, 所有的错误信息都写入标准错误流; 命令中执行的普通输出写入标准输出.
在主提示符或从属提示符后输入中断符 (通常是 Control-C 或者 DEL) 就会取消当前输入, 回到主提示符. [2] 执行命令时输入一个中断符会抛出一个 KeyboardInterrupt
异常, 它可以被 try
语句截获.
2.2.2. 可执行的 Python 脚本
类 BSD 的 UNIX 系统中, Python 脚本可以像 Shell 脚本那样直接执行, 只要在脚本文件开头加一行文本来声明模式:
#! /usr/bin/env python3.2
(要先确认 Python 解释器存在于用户的 PATH
环境变量中). #!
这两个字符必须是文件的头两个字符. 在某些平台上, 第一行必须以 UNIX 风格的行结束符 ('\n'
) 结束, 不能用 Windows ('\r\n'
) 的行结束符. 注意 , '#'
用于 Python 一行注释的开始.
脚本可以用 chmod 命令指定可执行模式或权限:
$ chmod +x myscript.py
在 Windows 系统下, 没有 “可持行模式 (executable mode)” 的概念. Python 安装器会自动地把 .py
后缀的文件与 python.exe
绑定, 因此双击一个 Python 文件, 就可以把它作为脚本来运行. 扩展名也可以是 .pyw
, 这时工作台窗口会隐藏不被打开.
2.2.3. 源程序编码
默认情况下, Python 源码文件以 UTF-8 编码. 在这种编码下,世界上大多数语言的字符都可以用于, 字符串常量, 标识符, 以及注释 . 尽管标准库遵循一个所有可移植代码都应遵守的约定: 仅使用 ASCII 字符作为标识符, 这是所有可移植代码都应该遵守的约定.
要正确地显示所有这些字符, 你的编辑器一定要有能力辨认出是 UTF-8 编码, 还要使用一个支持所有文件中字符的字体.
为源文件选择一个另外的编码也是可行的. 为此, 要在 #!
行后面指定一个特殊的注释行, 以定义源码文件的编码:
# -*- coding: encoding -*-
有了这样的声明, 源文件中的所有字符都会被以 encoding 的编码来解读,而非是 UTF-8
在 Python 库参考的 codecs
一节可以找到所有可用的编码.
例如, 如果你使用的编辑器不支持 UTF-8 编码, 但是支持另一种称为 Windows-1252 的编码, 你可以在源码中写上:
# -*- coding: cp-1252 -*-
这样就可以在源码文件中使用 Windows-1252 字符集. 这个特殊的编码注释必须在代码文件的 第一或第二 行.
2.2.4. 交互式启动文件
交互式地使用 Python 解释器时, 我们可能需要在每次启动时执行一些命令. 为了做到这点, 你可以设置一个名为 PYTHONSTARTUP
的变量, 指向包含启动命令的文件. 这类似于 Unix Shell 的 .profile
文件.
这个文件只在交互式会话中才被读取, 当 Python 从脚本中读取命令或显式地以 /dev/tty
作为命令源时 (尽管它的行为很像是处在交互会话期) 则不会如此. 它与解释器执行的命令处在同一个命名空间, 所以由它定义或引用的一切可以在解释器中不受限制的使用. 你也可以在这个文件中改变 sys.ps1
和 sys.ps2
的值.
如果你想要在当前目录中执行额外的启动文件, 可以在全局启动文件中加入类似以下的代码: if os.path.isfile('.pythonrc.py'): exec(open('.pythonrc.py').read())
. 如果你想要在某个脚本中使用启动文件, 必须要在脚本中写入这样的语句:
import os filename = os.environ.get('PYTHONSTARTUP') if filename and os.path.isfile(filename): exec(open(filename).read())
2.2.5. 定制模块
Python 为你提供两个钩子 (hook) 来定制交互环境: sitecustomize
和 usercustomize
. 要知道它如何工作, 你需要先找到你的 user site-package 目录的位置. 打开 Python 并运行这段代码:
>>> import site >>> site.getusersitepackages() '/home/user/.local/lib/python3.2/site-packages'
现在你可以在那个目录下创建一个名为 usercustomize.py
的文件, 并在里面放置任何你想放的东西. 它将影响到每一次 Python 的调用, 除非使用了 -s
选项来禁用了自动导入功能.
sitecustomize
以同样的方式工作, 但通常由该计算机的管理员在全局 site-packages 目录下创建, 并且在 usercustomize
之前被导入. 参看 site
模块的文档获取更多细节.