### 2. Python 解释器
### 2.1 调用解释器
Python 解释器在可用的机器上通常安装成/usr/local/bin/python3.4;将/usr/local/bin放在您的 Unix shell 搜索路径,使得可以通过在shell 中键入命令
~~~
python3.4
~~~
来启动它。[[1]](#)由于解释器放置的目录是一个安装选项,其他地方也是可能的;请与您的 Python 专家或系统管理员联系。(例如, /usr/local/python是一个常见的替代位置。
在Windows机器上,Python的安装通常是放置在C:\Python3,当然你可以在运行安装程序时进行更改。你可以在一个DOS窗口的命令提示符下键入以下命令来把这个目录添加到路径中:
~~~
set path=%path%;C:\python34
~~~
主提示符下键入文件结束字符 ( Unix 上是Control-D 、 Windows 上是Control-Z) 会导致该解释器以零退出状态退出。如果无法正常工作,您可以通过键入以下命令退出解释器: quit()。
编辑器的行编辑功能包括交互式编辑,历史记录和代码补全,其中代码补全功能需要系统支持readline库。也许最快的检查,看看是否支持命令行编辑对你的第一个 Python 提示Ctrl-P。如果它发出蜂鸣声,则有命令行编辑 ;请参阅附录[*交互式输入编辑和历史替代*](#) 的有关快捷键的介绍。如果什么都没发生,或者显示^ P,命令行编辑不可用 ;你就只能够使用退格键删除当前行中的字符。
解释器有些像 Unix shell:当使用tty设备作为标准输入调用时,它交互地读取并执行命令 ;当用文件名参数或文件作为标准输入调用,它将读取并执行该文件中的*脚本*。
第二种启动解释器的方式是python-ccommand[arg]...,这种方式是在*command*中执行语句,类似于 shell 的[*-c*](#)选项中。因为 Python 语句经常包含空格或其他shell 特殊字符,通常建议把全部*命令*放在单引号里。
有些 Python 模块同时也是可执行的脚本。这些模块可以使用python-mmodule[arg]......直接调用,这和在命令行输入完整的路径名执行*模块* 的源文件是一样的。
当使用一个脚本文件时,它有时是很有用能够运行该脚本,之后进入交互模式。这可以通过在脚本前面加上[*-i*](#) 选项实现。
#### 2.1.1. 参数传递
调用解释器时,脚本名称和其他参数被转换成一个字符串列表并赋值给sys模块中的argv变量。你可以通过importsys访问此列表。列表的长度是至少是 1 ;如果没有给出脚本和参数, sys.argv[0]是一个空字符串。当使用[*-c*](#)*命令*时, sys.argv[0]设置为'-c'。当使用[*-m*](#)*模块参数*时, sys.argv[0]被设定为指定模块的全名。[*-c*](#)*选项*或[*-m*](#)*选项*后面的选项不会被Python 解释器处理,但是会被保存在sys.argv中,供命令或模块使用。
#### 2.1.2. 交互模式
当从 tty 读取命令时,我们说解释器在*交互模式* 下。这种模式下,解释器以*主提示符* 提示输入命令,主提示符通常标识为三个大于号(>>>) ;如果有续行,解释器以*从提示符* 提示输入,默认为三个点 (...)。在第一个提示符之前,解释器会打印出一条欢迎信息声明它的版本号和授权公告:
~~~
$ python3.4
Python 3.4 (default, Mar 16 2014, 09:25:04)
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
~~~
输入多行结构时需要续行。作为一个例子,看看这个[if](#)语句:
~~~
>>> the_world_is_flat = True
>>> if the_world_is_flat:
... print("Be careful not to fall off!")
...
Be careful not to fall off!
~~~
### 2.2. 解释器及其环境
#### 2.2.1. 错误处理
错误发生时,解释器会打印错误信息和堆栈跟踪信息。在交互模式下,它会返回到主提示符;当输入来自一个文件,它会打印堆栈跟踪信息,然后以非零退出状态退出。(由[try](#)语句中[except](#)的子句处理的异常不是在这方面的错误)。有些错误是致命的并导致非零状态退出;这通常由于内部不一致和某些情况下的内存不足导致。所有错误消息都写入标准错误流;执行命令的普通输出写入标准输出。
在主提示符或从提示符后输入中断符(通常为Control-C或DEL)可以取消输入,并返回到主提示符。[[2]](#)命令执行过程中输入中断符将引发[KeyboardInterrupt](# "KeyboardInterrupt")异常,它可以被[try](#)语句截获。
#### 2.2.2. 可执行的 Python 脚本
在类 BSD 的 Unix 系统上,可以将Python 脚本变成可直接执行的,就像 shell 脚本一样。通过放置一行
~~~
#! /usr/bin/env python3.4
~~~
(假定解释器在用户的PATH 中) 在脚本的开始并且给文件可执行的模式。#!必须是文件的前两个字符。在一些平台上,这第一行必须以一个 Unix 风格的行结束符 ('\n'),而不是 Windows 的行结束符 ('\r\n') 结尾。注意,字符 '#',是Python 注释的起始符号。
可以通过 **chmod** 命令给予脚本可执行的模式或权限:
~~~
$ chmod +x myscript.py
~~~
在 Windows 系统上,没有"可执行模式"的概念。Python 安装程序会自动将 .py 文件与 python.exe 关联,双击 Python 文件将以脚本的方式运行它。扩展名也可以是 .pyw,在这种情况下,通常出现的控制台窗口不会在显示了。
#### 2.2.3. 源程序的编码
Python源文件默认以UTF-8编码。在这种编码下,世界上大多数语言的字符可以在字符串,标识符和注释中同时使用 — 尽管标准库中的标识符只使用ASCII字符,它是可移植代码应该遵循的一个惯例。为了能够正确显示所有的这些字符,你的编辑器必须能够识别文件是UTF-8编码,且必须使用支持文件中所有字符的字体。
也可以给源文件指定一个不同的编码。方法是在 #! 行的后面再增加一行特殊的注释来定义源文件的编码:
~~~
# -*- coding: encoding -*-
~~~
通过此声明,源文件中的所有字符将被视为由 *encoding* 而不是UTF-8编码。在 Python 库参考手册的 [codecs](# "codecs: Encode and decode data and streams.") 小节中,可以找到所有可能的编码方式列表。
例如,如果你选择的编辑器不支持UTF-8编码的文件,而只能用其它编码比如Windows-1252,你可以这样写:
~~~
# -*- coding: cp-1252 -*-
currency = u"€"
print ord(currency)
~~~
并且源文件中的所有字符仍然使用Windows-1252字符集。这个特殊的编码注释必须位于文件的*第一或者第二* 行。
#### 2.2.4. 交互式启动文件
当您以交互方式使用 Python 时,让解释器在每次启动时执行一些标准命令会变得非常方便。你可以通过设置环境变量 [PYTHONSTARTUP](#) 为包含你的启动命令的文件的名字。这类似于 Unix shell 的.profile功能。
这个文件只会在交互式会话时读取,当 Python 从脚本中读取命令时不会读取,当/dev/tty 在命令中明确指明时也不会读取 (尽管这种方式很像是交互方式)。它和交互式命令在相同的命名空间中执行,所以在交互式会话中,由它定义或引用的一切可以在解释器中不受限制地使用。您还可以在此文件中更改sys.ps1和sys.ps2 的提示符。
如果您想要从当前目录读取额外的启动文件,你可以在全局启动文件中使用这样的代码 ifos.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 提供了两个钩子(方法)来本地化: sitecustomize和usercustomize。若要查看它是如何工作,你首先需要找到你的 site-packages 的目录。启动 Python 并运行下面的代码:
~~~
>>> import site
>>> site.getusersitepackages()
'/home/user/.local/lib/python3.4/site-packages'
~~~
现在你可以在此目录下创建名为usercustomize.py的文件,并把任何你想要的东西放在里面。它会影响每个 Python 调用,除非启动时用[*-s*](#)选项来禁用自动导入。
sitecustomize的工作方式相同,但通常由计算机的管理员在全局 site-packages 目录中创建,并在usercustomize之前导入。更多详细信息请参阅 [site](# "site: Module responsible for site-specific configuration.") 模块的文档。
脚注
| [[1]](#) | On Unix, the Python 3.x interpreter is by default not installed with the executable named python, so that it does not conflict with a simultaneously installed Python 2.x executable. |
|-----|-----|
| [[2]](#) | A problem with the GNU Readline package may prevent this. |
|-----|-----|
- Python 2 教程
- 1. 吊吊你的胃口
- 2. Python 解释器
- 3. Python简介
- 4. 控制流
- 5. 数据结构
- 6. 模块
- 7. 输入和输出
- 8. 错误和异常
- 9. 类
- 10. 标准库概览
- 11. 标准库概览 — 第II部分
- 12.现在怎么办?
- 13. 交互式输入的编辑和历史记录
- 14. 浮点数运算:问题和局限
- Python 2 标准库
- 1. 引言
- 2. 内建函数
- 3. 不太重要的内建函数
- 4. 内建的常量
- 5. 内建的类型
- 6. 内建的异常
- 7. String Services
- 8. Data Types
- 9. Numeric and Mathematical Modules
- 10. File and Directory Access
- 11. Data Persistence
- 13. File Formats
- 14. Cryptographic Services
- 15. Generic Operating System Services
- 16. Optional Operating System Services
- 17. Interprocess Communication and Networking
- 18. Internet Data Handling
- 20. Internet Protocols and Support
- 26. Debugging and Profiling
- 28. Python Runtime Services
- Python 2 语言参考
- 1. 简介
- 2. 词法分析
- 3. 数据模型
- 4. 执行模型
- 5. 表达式
- 6. 简单语句
- 7. 复合语句
- 8. 顶层的组件
- 9. 完整的语法规范
- Python 3 教程
- 1. 引言
- 2. Python 解释器
- 3. Python简介
- 4. 控制流
- 5. 数据结构
- 6. 模块
- 7. 输入和输出
- 8. 错误和异常
- 9. 类
- 10. 标准库概览
- 11. 标准库概览 — 第II部分
- 12.现在怎么办?
- 13. 交互式输入的编辑和历史记录
- 14. 浮点数运算:问题和局限