原文可参见:http://docs.python.org/3.3/tutorial/interpreter.html
2.1 调用解释器
在Linux/Unix系统下,Python的解释器通常安装在/usr/local/bin/python3.3下。将/usr/local/bin配置到系统Path下,你可以在命令行敲入以下命令来调用它:
python3.3
因为Python的安装目录可以任意选定,所以你最好查一下Python安装的具体位置,然后再进行path的配置。
如果是windows机器的话,Python通常会安装在c:\Python33,当然你也可以指定你想安装的地方了。为了将这个路径添加到你的系统路径中,你可以键入以下命令在命令行窗口中:
set path=%path%;C:\python33
键入文件结束符(Unix下是Control+D,Window下是Cnotrol+Z)会强制退出解释器。如果这样不生效的话,你也可以在命令行键入:quit() 来退出解释器。
解释器的命令编辑功能通常是相当烂的。在Unix系统下,某些人安装解释器的时候可能开启了对GNU readline库的支持,在这种情况下你可以使用到一些优雅的交互式功能或历史命令记录功能。检查命令行编辑功能是否支持的一个办法是当你首先看到Python提示的时候,键入Control+P到命令行中,如果它哔的一声,那说明你有命令行编辑功能。请参考Interactive Input Editing and History Substitution 中对快捷键的介绍。如果没有任何情况发生,或者`P回显了出来,则说明命令行编辑功能是没有被支持的,你将只能苦逼的使用backspace等一些基本的字符操作键了。
解释器工作方式有点类似Unix的shell:当依赖于标准输入来执行时,它交互式的读取和执行命令;当依赖于一个文件作为参数或者以文件来作为标准输入时,它读取和执行文件中的脚本。
另一种启动解释器的方法是通过: python -c command [arg] ……,该方式是在命令行中执行语句,模拟shell的-c选项。因为Python中的语句经常包含着空格或者其它字符,某些字符对shell来说是特殊的,所以一个很好的习惯就是把执行的语句放到单引号中括起来。
一些Python的模块本身就是非常有用的脚本。你可以通过 python -m module [arg] ……来执行模块中的源代码。当然,你得记得住模块的名字才行了。
当一个脚本在被使用的时候,有些时候需要先运行脚本然后再进入交互模式,这种应用场景可以在执行脚本之前添加-i选项来实现。
2.1.1 参数传递
脚本的名字和额外的参数会转换成一个string的列表,然后赋值到sys模块下的argv变量中。你可以通过执行import sys来访问这个列表。该列表的长度至少为1,当没有脚本或者变量给定时,sys.argv[0]是一个空字符串。当脚本的名字通过'-'来给定时(意味着标准输入),sys.argv[0]被设置成'-'。当 -c command被使用时,sys.argv[0]被设置成'-c'。当 -m module被使用时, sys.argv[0]被设置成module的全名。紧跟在-c command或者-m module之后的option并不会有Python解释器来处理,而会保存在sys.argv中交由对应的命令行或者模块来处理。
2.1.2 交互模式
当命令由一个tty来读取的时候,该解释器可以被认为处于交互模式。(至于什么是tty,我也不知道。。。)在这个模式下,它会用一级提示符来提示可以输入下一个命令,通常该提示符是三个大于符号(>>>)。对于延续行来讲,它采用二级提示符来提示,通常是三个点好(...)。在打印一级提示信息之前,解释器会先打印欢迎信息、版本信息和版权信息:
$ python3.3
Python 3.3 (default, Sep 24 2012, 09:25:04)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
当输入多行结构的时候,延续行是必须的。作为一个例子,请参看下面的if语句:
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
... print("Be careful not to fall off!")
...
Be careful not to fall off!
2.2 解释器和它的环境
2.2.1错误处理
当错误发生时,解释器会将错误信息和堆栈信息打印出来。在交互式模式下,解释器将会从一级提示中返回。当错误是来自文件时,在打印出堆栈信息后,它会以一个非零的退出状态返回。(由except和try语句处理的异常并不是该处所说的错误。) 由于一些内部的不一致和一些内存溢出等问题存在,执行程序可能会导致致命性的错误并以一个非0状态值返回。所有的错误信息都被写入到标准的错误流中。执行命令这种普通的输出则会写入到标准的输出中。
在一级提示符或者二级提示符下键入中断字符(通常是Control-C或DEL)会取消当前的输入并返回到一级提示符下。在命令执行的时候键入中断字符会触发KeyboardInterrupt异常,如果脚本中有try语句的话,可能会对该异常进行处理。
2.2.2 可执行的Python脚本
在BSD这种Unix系统下,Python脚本可以像shell脚本一样直接运行,通过将下面一行添加到脚本文件的开头:
#! /usr/bin/env python3.3
当然,必须解释器已经在用户的path中哈。其中'#!'必须是这个脚本文件的起始两个字符。在一些平台中,这一行必须要用unx风格的结束符('\n')来结束,而不是windows的('\r\n')。注意这个哈希字符'#'在python中是用来表示注释的。
脚本需要被赋予可执行模式或也可叫作可执行的权限,使用chmod命令:
$ chmod +x myscript.py
在windows系统中,没有可执行模式的概念。Python安装的时候会自动关联.py类型的文件到python.exe,所以你可以通过双击python 文件来运行它。注意,脚本文件的后缀名也可以.pyw结尾,在这种情况下,终端窗口将不会显示。
2.2.3 源代码的编码
Python的源代码默认情况下使用utf-8进行编码。通过utf-8,世界上大多数语言的字符可以在字符串常量、命名和注释中使用。尽管标准库使用的是ascii编码,但如果你想你的代码能更好的移植的话,还是使用utf-8吧。为了能正常的现实这些字符,你的编辑器需要能识别utf-8编码,同时还必须有相对应支持的字体。
当然,你也可以使用其它的编码格式。你只需要将一个特殊的注释行放在#!声明行之后:
# -*- coding: encoding -*-
使用了以上声明之后,该文件将会使用你指定的编码格式来进行编码。Python库可以支持的所有编码格式可以参考:codecs.
举个例子,如果你的编辑器不支持utf-8,而想使用其它的编码,比如windows-1252的话,你可以在源文件中添加:
# -*- coding: cp-1252 -*-
注意,该声明必须在源文件中的第一行或者第二行(如果有#!声明的话)。
2.2.4 互动模式下的启动文件
在你使用Python中的交互式模式的时候,你可能需要一些标准的命令在Python解释器每次启动的时候都被执行。你可以通过设置环境变量PYTHONSTARTUP来实现这个功能,该环境变量的值是一个包含你要执行的命令的文件。这有点像Unix shell中的.profile功能。
这个文件只会在交互式模式下被读取,在执行脚本的时候并不会读取。该文件的执行和交互式命令的执行在同一个命名空间,所以文件中定义或者引用的对象可以直接被交互式命令所引用。
如果你想在当前目录下读取启动文件的话,你可以在全局启动文件中写入类似的代码,比如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提供了切入点来允许你做定制:sitecustomize和usercustomize。在看它如何工作之前,你需要先找到你的user site-package目录。打开Python然后运行一下代码:
>>> import site
>>> site.getusersitepackages()
'/home/user/.local/lib/python3.2/site-packages'
现在你可以创建一个文件比如usercustomize.py在那个目录下,然后在该文件内做任何你想做的事情。它会影响到在python中所有的调用,除非你使用-s参数来关闭自动导入功能。言外之意是在这里放入的代码,在执行python的时候会被自动导入进去。
sitecustomize和usercustomize类似,只是它由电脑的管理员创建在全局的site-package目录,并且在usercustomize之前导入。请参见 site 模块来查看详细信息。