### 15.1.1\. 错误处理
当错误发生时,解释器打印一个错误信息和堆栈跟踪。在交互模式下,它返回主提示符;当输入来自文件的时候,在打印堆栈跟踪后以非零退出状态退出。(在 try 声明中被 except 子句捕捉到的异常在这种情况下不是错误。)有些错误是非常致命的会导致一个非零状态的退出;这也适用于内部错误以及某些情况的内存耗尽。所有的错误信息都写入到标准错误流;来自执行的命令的普通输出写入到标准输出。
输入中断符(通常是 Control-C 或者 DEL)到主或者从提示符中慧取消输入并且返回到主提示。[[1]](http://www.pythondoc.com/pythontutorial3/appendix.html#id7)当命令执行中输入中断符会引起 KeyboardInterrupt 异常,这个异常能够被一个 try 声明处理。
### 15.1.2\. 可执行 Python 脚本
在 BSD’ish Unix 系统上,Python 脚本可直接执行,像 shell 脚本一样,只需要把下面内容加入到
~~~
#!/usr/bin/env python3.4
~~~
(假设 python 解释器在用户的 PATH 中)脚本的开头,并给予该文件的可执行模式。#! 必须是文件的头两个字符。在一些系统上,第一行必须以 Unix-style 的行结束符('\n')结束,不能以 Windows 的行结束符('\r\n')。 注意 '#' 在 Python 中是用于注释的。
使用 **chmod** 命令能够给予脚本执行模式或者权限。
~~~
$ chmod +x myscript.py
~~~
在 Windows 系统上,没有一个 “可执行模式” 的概念。Python 安装器会自动地把 .py 文件和python.exe 关联起来,因此双击 Python 分拣将会把它当成一个脚本运行。文件扩展名也可以是.pyw,在这种情况下,运行时不会出现控制台窗口。
### 15.1.3\. 交互式启动文件
当你使用交互式 Python 的时候,它常常很方便地执行一些命令在每次解释器启动时。你可以这样做:设置一个名为 PYTHONSTARTUP 的环境变量为包含你的启动命令的文件名。这跟 Unix shells 的.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):
with open(filename) as fobj:
startup_file = fobj.read()
exec(startup_file)
~~~
### 15.1.4\. 定制模块
Python 提供两个钩子为了让你们定制 sitecustomize 和 usercustomize。为了看看它的工作机制的话,你必须首先找到你的用户 site-packages 目录的位置。启动 Python 并且运行这段代码:
~~~
>>> import site
>>> site.getusersitepackages()
'/home/user/.local/lib/python3.4/site-packages'
~~~
现在你可以创建一个名为 usercustomize.py 的文件在你的用户 site-packages 目录,并且在里面放置你想要的任何内容。它会影响 Python 的每一次调用,除非它以 _-s_ (禁用自动导入)选项启动。
sitecustomize 以同样地方式工作,但是通常由是机器的管理员创建在全局的 site-packages 目录中,并且是在 usercustomize 之前导入。请参阅 site 模块获取更多信息。
Footnotes
| [[1]](http://www.pythondoc.com/pythontutorial3/appendix.html#id4) | GNU 的 Readline 包的问题可能会阻止这种做法。 |
- Python 入门指南
- 1. 开胃菜
- 2. 使用 Python 解释器
- 2.1. 调用 Python 解释器
- 2.2. 解释器及其环境
- 3. Python 简介
- 3.1. 将 Python 当做计算器
- 3.2. 编程的第一步
- 4. 深入 Python 流程控制
- 4.1. if 语句
- 4.2. for 语句
- 4.3. range() 函数
- 4.4. break 和 continue 语句, 以及循环中的 else 子句
- 4.5. pass 语句
- 4.6. 定义函数
- 4.7. 深入 Python 函数定义
- 4.8. 插曲:编码风格
- 5. 数据结构
- 5.1. 关于列表更多的内容
- 5.2. del 语句
- 5.3. 元组和序列
- 5.4. 集合
- 5.5. 字典
- 5.6. 循环技巧
- 5.7. 深入条件控制
- 5.8. 比较序列和其它类型
- 6. 模块
- 6.1. 深入模块
- 6.2. 标准模块
- 6.3. dir() 函数
- 6.4. 包
- 7. 输入和输出
- 7.1. 格式化输出
- 7.2. 文件读写
- 8. 错误和异常
- 8.1. 语法错误
- 8.2. 异常
- 8.3. 异常处理
- 8.4. 抛出异常
- 8.5. 用户自定义异常
- 8.6. 定义清理行为
- 8.7. 预定义清理行为
- 9. 类
- 9.1. 术语相关
- 9.2. Python 作用域和命名空间
- 9.3. 初识类
- 9.4. 一些说明
- 9.5. 继承
- 9.6. 私有变量
- 9.7. 补充
- 9.8. 异常也是类
- 9.9. 迭代器
- 9.10. 生成器
- 9.11. 生成器表达式
- 10. Python 标准库概览
- 10.1. 操作系统接口
- 10.2. 文件通配符
- 10.3. 命令行参数
- 10.4. 错误输出重定向和程序终止
- 10.5. 字符串正则匹配
- 10.6. 数学
- 10.7. 互联网访问
- 10.8. 日期和时间
- 10.9. 数据压缩
- 10.10. 性能度量
- 10.11. 质量控制
- 10.12. “瑞士军刀”
- 11. 标准库浏览 – Part II
- 11.1. 输出格式
- 11.2. 模板
- 11.3. 使用二进制数据记录布局
- 11.4. 多线程
- 11.5. 日志
- 11.6. 弱引用
- 11.7. 列表工具
- 11.8. 十进制浮点数算法
- 12. 接下来?
- 13. 交互式输入行编辑历史回溯
- 13.1. 行编辑
- 13.2. 历史回溯
- 13.3. 快捷键绑定
- 13.4. 其它交互式解释器
- 14. 浮点数算法:争议和限制
- 14.1. 表达错误
- 15. 附录
- 15.1. 交互模式