小段落


2. 使用Python的直译器


2.1 如何启动直译器

在Unix之类的作业系统上,如果有安装的话,Python直译器通常安装在 /usr/local/bin/python 这个目录中。你可能需要先在Shell中设定寻找 /usr/local/bin 目录,这样你才可以在Shell中打入以下的指令来启动Python直译器

python

你的Python直译器安装的位置是可以在安装时设定的,因此也有可能安装在其他的地方。你也许需要问你周遭的Python大师或是系统管理员才能知道正确的安装位置( /usr/local/python 是另外一个普遍的可能安装所在)。

要离开Python直译器的话,打入EOF的字元( 在Unix上是 Control-D ,在DOS及Windows上是 Control-Z 就会使得直译器离开(zero exit status)。如果行不通的话,你可以打入以下指令离开直译器: "import sys; sys.exit()".

Python直译器使用每行编辑,应该不难使用。在Unix上,也许安装Python直译器的人有安装使用GNU readline程式库的功能,这样的话你会有互动式编辑以及编辑过去资料的功能。最简单的检查你有没有这项功能的方法就是在Python的提示之下打入Control-P ,如果有哔声的话,就表示你有这项功能,你可以翻到 附录 A 去看特殊键的用法。如果你没有听到哔声,或是只出现 P 的话,就表示你没有这项功能,你得使用倒退键(backspace)来清除目前所在行的字元了。

Python直译器的操作方法根Unix shell很像:当被呼叫时所连结的标准输入是tty device(终端机)的话,直译器会互动的读及执行所输入的指令。当被呼叫时加入档案名称参数或所连结的标准输入是连到档案的话,直译器就会读入并执行该档所含有的 script

第三种启动直译器的方法是打入以下的指令 "python -c command [arg] ..." ,这个指令会执行 command 所代表的叙述(这跟shell的 -c option很像),因为Python叙述(statement)常有空白及特殊字元,所以用此法时可以把 command 所代表的叙述用””括起来,以免跟shell的其他特殊字元或是参数有所混淆。

要注意的是 "python file" 指令跟 "python <file"指令是有所区分的。对后者而言,不单单只有执行这个script,而且程式中有关输入的需求(例如呼叫 input() 或是 raw_input() ) 也都会由这个 file 来满足。由于此file已经在程式执行之初已经被从头到尾读过一次,所以一执行这个程式将会马上就碰到了EOF。相反的对于前一个写法来说,程式的输入需求是由任何连结到Python直译器的标准输入(standard input)的装置或档案来满足的,而这个也许才是你所想要的结果。

当script档案在使用的时候,也许你会想要执行这个script然后还可以之后继续进入互动的模式。这时你可以加入 -i 这个选项。但是如同前一段所说的,如果此script是由标准输入来读进去的话就没有办法这样做了。


2.1.1 参数的传递

如果interpreter认识sys的话(译:可用“import sys”指令),script的档案名及附加传入的参数都会被纪录在 sys.argv 这个变数并并传给script来使用。sys.argv 是一列的字串,长度至少为1,如果你什么都档案或参数都没传的话, sys.argv[0] 就是一个空字串。如果script的名字是 '-' (就是标准输入的意思)的话, sys.argv[0] 就会被设为 '-' 。当使用 -c command 的话, sys.argv[0] 就被设定为 '-c' 所有的在 -c command 之后的option(例如 –i )都会被当成 sys.argv 而被command所处理,所以就不是当作option一样的来看待了。


2.1.2 互动模式

当指令是由tty终端机来传入时,我们称之为互动模式( interactive mode)。在此模式之下会出现主要的命令提示符号( primary prompt)来提示输入下一个指令,这个primary prompt通常是 "> >" 。如果是指令是延续上一行的话就会出现secondary prompt符号,这个 secondary prompt 就通常是 "... " 。一进入python的互动模式的话直译器会出现一个欢迎信息,以及版本编号辑版权说明,接下来就是第一个prompt。如下所示:

python
Python 1.5.2b2 (#1, Feb 28 1999, 00:02:06) [GCC 2.8.1] on sunos5
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>>

当你输入需要多行的结构时,直译器就会自动会出现延续上一行的prompt符号,下面的例子是 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 程式错误处理

当有错误产生时,直译器就会在萤幕印出错误的信息以及stack trace的所有资料。在互动模式之下,印完资料之后会再印出prompt来。如果输入是来自于档案的话,在出现错误的情况下直译器在印出stack trace之后程式会以nonzero exit 的状态结束。(此处讨论不包含已经由 try 叙述及 except 子句处理外的状况(Exceptions))。有些的程式错误是没有办法挽救并且会造成nonzero exit的结束情况,这常常是内部的不一致或是某种running out of memory所造成。所有的错误信息都会被写入至标准error stream之中,正常的程式执行的输出则会写入到标准(standard output)输出之中。

如果在primary或是secondary prompte之下打入中断字元(通常是 Control-C 或是 DEL),这会造成输入的中断并且会回到prompt之下。 2.1 在指令执行之中打入中断字元则会引起 KeyboardInterrupt 的exception,而这是可以在 try 叙述中处理的。


2.2.2 执行Python脚本(script)

在BSD之类的Unix 系统上,我们可以在script的最前面加入以下的叙述(类似shell script),并改变档案属性为可执行:

#! /usr/bin/env python

如此script就会变成可执行档,可以直接执行 (假设Python的直译器是在user的 $PATH) 变数之中) 。 "#!" 这两个字必须在script档案的最前面。值得一提的是 "#" 在Python之中也当作注解(comment)部分开始的符号。


2.2.3 互动式启动档(startup file)

当你使用互动模式的时候,如果可以在每次直译器要启动时先执行一些命令的话将是很有用的。要达成如此功能,你可以设定一个档案名称给环境变数 $PYTHONSTARTUP ,这个档案可以包含你想要在启动时执行的命令,类似 .profile 在Unix shell中的用法。

这个启动档(startup file)只有对在互动模式下有效,如果你用Python读入script时就没有用,在当 /dev/tty 是命令的输入来源也没有用(其他的情况与互动模式相类似)。这个startup file所执行命令的命名空间是与其他互动模式下输入的指令相同,所以在startup file内定义或是import的物件,在之后的互动模式指令中都是可以直接使用的。你也可以在这个startup file中改变 sys.ps1sys.ps2 ,如此就可以改变你的primary prompt及secondary prompt。

如果你在你的startup file中想要使用另外的在目前目录的startup file,你只需要在主要startup file (global start-up file)写入 "if os.path.isfile('.pythonrc.py'): execfile('.pythonrc.py')" 。如果你想要在你的script之中使用startup file的话,你必须在你的script中写入:

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
execfile(filename)



注脚

... 回到prompt之下。 2.1
有一个GNU Readline package的问题可能会使这个功能失效。

请看关于此文件… 里面有关如何给我们建议的说明。