📄 node4.html
字号:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head> <title>2. 使用Python的直译器</title> <meta name="description" content="2. 使用Python的直译器 "> <meta name="keywords" content="tut"> <meta name="resource-type" content="document"> <meta name="distribution" content="global"> <link rel="STYLESHEET" href="tut.css"> <link rel="next" href="node5.html"> <link rel="previous" href="node3.html"> <link rel="up" href="tut.html"> <link rel="next" href="node5.html"></head> <body> <div class="navigation"><table align="Center" width="100%" cellpadding="0" cellspacing="2"> <tbody> <tr> <td><a href="node3.html"><img src="../icons/previous.gif" border="0" height="32" alt="Previous Page" width="32"></a></td> <td><a href="tut.html"><img src="../icons/up.gif" border="0" height="32" alt="Up One Level" width="32"></a></td> <td><a href="node5.html"><img src="../icons/next.gif" border="0" height="32" alt="Next Page" width="32"></a></td> <td align="Center" width="100%">Python 教学文件</td> <td><a href="node2.html"><img src="../icons/contents.gif" border="0" height="32" alt="Contents" width="32"></a></td> <td><img src="../icons/blank.gif" border="0" height="32" alt="" width="32"></td> <td><img src="../icons/blank.gif" border="0" height="32" alt="" width="32"></td> </tr> </tbody></table> <b class="navlabel">Previous:</b> <a class="sectref" href="node3.html">1.开胃菜</a> <b class="navlabel">Up:</b> <a class="sectref" href="tut.html">Python教学文件</a> <b class="navlabel">Next:</b> <a class="sectref" href="node5.html">3. 非正式的Python介绍</a> <br><hr></div> <!--End of Navigation Panel--> <!--Table of Child-Links--> <a name="CHILD_LINKS"><strong>小段落 </strong></a> <ul> <li><a name="tex2html226" href="node4.html#SECTION004100000000000000000">2.1 如何启动直译器 </a> <ul> <li><a name="tex2html227" href="node4.html#SECTION004110000000000000000">2.1.1 参数的传递 </a> </li> <li><a name="tex2html228" href="node4.html#SECTION004120000000000000000">2.1.2 互动模式 </a> </li> </ul> </li> <li><a name="tex2html229" href="node4.html#SECTION004200000000000000000">2.2 直译器及其周边环境 </a> <ul> <li><a name="tex2html230" href="node4.html#SECTION004210000000000000000">2.2.1 程式错误处理 </a> </li> <li><a name="tex2html231" href="node4.html#SECTION004220000000000000000">2.2.2 执行Python脚本(Script) </a> </li> <li><a name="tex2html232" href="node4.html#SECTION004230000000000000000">2.2.3 互动式启动档(startup file) </a> </li> </ul> </li></ul> <!--End of Table of Child-Links--> <hr> <h1> <br> 2. 使用Python的直译器 </h1> <p> </p><h1> <br> 2.1 如何启动直译器 </h1> <p> 在Unix之类的作业系统上,如果有安装的话,Python直译器通常安装在 <span class="file">/usr/local/bin/python</span> 这个目录中。你可能需要先在Shell中设定寻找 <span class="file">/usr/local/bin</span> 目录,这样你才可以在Shell中打入以下的指令来启动Python直译器 </p><p> </p><dl><dd><pre class="verbatim">python<br></pre> </dd> </dl> <p> 你的Python直译器安装的位置是可以在安装时设定的,因此也有可能安装在其他的地方。你也许需要问你周遭的Python大师或是系统管理员才能知道正确的安装位置( <span class="file">/usr/local/python</span> 是另外一个普遍的可能安装所在)。 </p> <p> 要离开Python直译器的话,打入EOF的字元( 在Unix上是 <kbd>Control-D</kbd> ,在DOS及Windows上是 <kbd>Control-Z</kbd> 就会使得直译器离开(zero exit status)。如果行不通的话,你可以打入以下指令离开直译器: "<tt class="samp">import sys; sys.exit()</tt>". </p> <p> Python直译器使用每行编辑,应该不难使用。在Unix上,也许安装Python直译器的人有安装使用GNU readline程式库的功能,这样的话你会有互动式编辑以及编辑过去资料的功能。最简单的检查你有没有这项功能的方法就是在Python的提示之下打入Control-P,如果有哔声的话,就表示你有这项功能,你可以翻到 <a href="node13.html#interacting">附录 A</a> 去看特殊键的用法。如果你没有听到哔声,或是只出现 <code>P</code> 的话,就表示你没有这项功能,你得使用倒退键(backspace)来清除目前所在行的字元了。 </p> <p> Python直译器的操作方法根Unix shell很像:当被呼叫时所连结的标准输入是tty device(终端机)的话,直译器会互动的读及执行所输入的指令。当被呼叫时加入档案名称参数或所连结的标准输入是连到档案的话,直译器就会读入并执行该档所含有的 <i>script</i> 。 </p> <p> 第三种启动直译器的方法是打入以下的指令 "<tt class="samp"><b class="program">python</b> <b class="programopt">-c</b> <var>command</var> [arg] ...</tt>" ,这个指令会执行 <var>command</var> 所代表的叙述(这跟shell的 <b class="programopt">-c</b> option很像),因为Python叙述(statement)常有空白及特殊字元,所以用此法时可以把 <var>command</var> 所代表的叙述用””括起来,以免跟shell的其他特殊字元或是参数有所混淆。 </p> <p> 要注意的是 "<tt class="samp">python file</tt>" 指令跟 "<tt class="samp">python<file</tt>"指令是有所区分的。对后者而言,不单单只有执行这个script,而且程式中有关输入的需求(例如呼叫 <code>input()</code> 或是 <code>raw_input()</code> ) 也都会由这个 <i>file</i> 来满足。由于此file已经在程式执行之初已经被从头到尾读过一次,所以一执行这个程式将会马上就碰到了EOF。相反的对于前一个写法来说,程式的输入需求是由任何连结到Python直译器的标准输入(standardinput)的装置或档案来满足的,而这个也许才是你所想要的结果。 </p> <p> 当script档案在使用的时候,也许你会想要执行这个script然后还可以之后继续进入互动的模式。这时你可以加入 <b class="programopt">-i</b> 这个选项。但是如同前一段所说的,如果此script是由标准输入来读进去的话就没有办法这样做了。 </p> <p> </p> <h2> <br> 2.1.1 参数的传递 </h2> <p> 如果interpreter认识sys的话(译:可用“import sys”指令),script的档案名及附加传入的参数都会被纪录在 <code>sys.argv</code> 这个变数并并传给script来使用。<code>sys.argv</code> 是一列的字串,长度至少为1,如果你什么都档案或参数都没传的话, <code>sys.argv[0]</code> 就是一个空字串。如果script的名字是 <code>'-'</code> (就是标准输入的意思)的话, <code>sys.argv[0]</code> 就会被设为 <code>'-'</code> 。当使用 <b class="programopt">-c</b> <var>command</var> 的话, <code>sys.argv[0]</code> 就被设定为 <code>'-c'</code> 所有的在 <b class="programopt">-c</b> <var>command</var> 之后的option(例如 –i)都会被当成 <code>sys.argv</code> 而被command所处理,所以就不是当作option一样的来看待了。 </p> <p> </p> <h2> <br> 2.1.2 互动模式 </h2> <p> 当指令是由tty终端机来传入时,我们称之为互动模式( <i>interactive mode</i>)。在此模式之下会出现主要的命令提示符号(<i>primary prompt</i>)来提示输入下一个指令,这个primary prompt通常是 "<tt class="samp">><code>></code>> </tt>" 。如果是指令是延续上一行的话就会出现secondary prompt符号,这个 <i>secondaryprompt</i> 就通常是 "<tt class="samp">... </tt>" 。一进入python的互动模式的话直译器会出现一个欢迎信息,以及版本编号辑版权说明,接下来就是第一个prompt。如下所示: </p> <p> </p> <dl> <dd><pre class="verbatim">python<br>Python 1.5.2b2 (#1, Feb 28 1999, 00:02:06) [GCC 2.8.1] on sunos5<br>Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam<br>>>><br></pre> </dd> </dl> <p> 当你输入需要多行的结构时,直译器就会自动会出现延续上一行的prompt符号,下面的例子是 <tt class="keyword">if</tt> 叙述的情况: </p> <p> </p> <dl> <dd><pre class="verbatim">>>> the_world_is_flat = 1<br>>>> if the_world_is_flat:<br>... print "Be careful not to fall off!"<br>... <br>Be careful not to fall off!<br></pre> </dd> </dl> <p> </p> <h1> <br> 2.2 直译器及其周边环境 </h1> <p> </p> <h2> <br> 2.2.1 程式错误处理 </h2> <p> 当有错误产生时,直译器就会在萤幕印出错误的信息以及stack trace的所有资料。在互动模式之下,印完资料之后会再印出prompt来。如果输入是来自于档案的话,在出现错误的情况下直译器在印出stacktrace之后程式会以nonzero exit 的状态结束。(此处讨论不包含已经由 <code>try</code> 叙述及 <code>except</code> 子句处理外的状况(Exceptions))。有些的程式错误是没有办法挽救并且会造成nonzero exit的结束情况,这常常是内部的不一致或是某种runningout of memory所造成。所有的错误信息都会被写入至标准error stream之中,正常的程式执行的输出则会写入到标准(standardoutput)输出之中。 </p> <p> 如果在primary或是secondary prompte之下打入中断字元(通常是 Control-C 或是 DEL),这会造成输入的中断并且会回到prompt之下。 <a name="tex2html1" href="#foot112"><sup>2.1</sup></a> 在指令执行之中打入中断字元则会引起 <code>KeyboardInterrupt</code> 的exception,而这是可以在 <code>try</code>叙述中处理的。 </p> <p> </p> <h2> <br> 2.2.2 执行Python脚本(script) </h2> <p> 在BSD之类的Unix 系统上,我们可以在script的最前面加入以下的叙述(类似shell script),并改变档案属性为可执行: </p> <p> </p> <dl> <dd><pre class="verbatim">#! /usr/bin/env python<br></pre> </dd> </dl> <p> 如此script就会变成可执行档,可以直接执行 (假设Python的直译器是在user的 <a class="envvar" name="l2h-1">$PATH</a>) 变数之中) 。 "<tt class="samp">#!</tt>" 这两个字必须在script档案的最前面。值得一提的是"<tt class="character">#</tt>" 在Python之中也当作注解(comment)部分开始的符号。 </p> <p> </p> <h2> <br> 2.2.3 互动式启动档(startup file) </h2> <p> 当你使用互动模式的时候,如果可以在每次直译器要启动时先执行一些命令的话将是很有用的。要达成如此功能,你可以设定一个档案名称给环境变数 <a class="envvar" name="l2h-2">$PYTHONSTARTUP</a> ,这个档案可以包含你想要在启动时执行的命令,类似 <span class="file">.profile</span> 在Unix shell中的用法。 </p> <p> 这个启动档(startup file)只有对在互动模式下有效,如果你用Python读入script时就没有用,在当 <span class="file">/dev/tty</span> 是命令的输入来源也没有用(其他的情况与互动模式相类似)。这个startup file所执行命令的命名空间是与其他互动模式下输入的指令相同,所以在startupfile内定义或是import的物件,在之后的互动模式指令中都是可以直接使用的。你也可以在这个startup file中改变 <code>sys.ps1</code> 及 <code>sys.ps2</code> ,如此就可以改变你的primary prompt及secondary prompt。 </p> <p> 如果你在你的startup file中想要使用另外的在目前目录的startup file,你只需要在主要startup file(global start-up file)写入 "<tt class="samp">if os.path.isfile('.pythonrc.py'): execfile('.pythonrc.py')</tt>" 。如果你想要在你的script之中使用startup file的话,你必须在你的script中写入: </p> <p> </p> <dl> <dd><pre class="verbatim">import os<br>filename = os.environ.get('PYTHONSTARTUP')<br>if filename and os.path.isfile(filename):<br> execfile(filename)<br></pre> </dd> </dl> <p> <br> </p> <hr> <h4>注脚</h4> <dl> <dt><a name="foot112">... 回到prompt之下。 </a><a name="foot112" href="node4.html#tex2html1"><sup>2.1</sup></a> </dt> <dd> 有一个GNU Readline package的问题可能会使这个功能失效。 </dd> </dl> <div class="navigation"> <table align="Center" width="100%" cellpadding="0" cellspacing="2"> <tbody> <tr> <td><a href="node3.html"><img src="../icons/previous.gif" border="0" height="32" alt="Previous Page" width="32"></a></td> <td><a href="tut.html"><img src="../icons/up.gif" border="0" height="32" alt="Up One Level" width="32"></a></td> <td><a href="node5.html"><img src="../icons/next.gif" border="0" height="32" alt="Next Page" width="32"></a></td> <td align="Center" width="100%">Python 教学文件</td> <td><a href="node2.html"><img src="../icons/contents.gif" border="0" height="32" alt="Contents" width="32"></a></td> <td><img src="../icons/blank.gif" border="0" height="32" alt="" width="32"></td> <td><img src="../icons/blank.gif" border="0" height="32" alt="" width="32"></td> </tr> </tbody> </table> <b class="navlabel">Previous:</b> <a class="sectref" href="node3.html">1.开胃菜</a> <b class="navlabel">Up:</b> <a class="sectref" href="tut.html">Python教学文件</a> <b class="navlabel">Next:</b> <a class="sectref" href="node5.html">3. 非正式的Python介绍</a> <br> <hr></div> <!--End of Navigation Panel--> <address> </address> <hr>请看<i><a href="about.html">关于此文件…</a></i> 里面有关如何给我们建议的说明。 </body> </html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -