shell

系统命令行和文件

虽然交互式提示符很适合实验和测试,但它有一个大的缺点:在那里输入的程序在 Python 解释器执行完它们后就消失了。因为交互输入的代码永远不会被保存到文件中,所以要想重新运行就得从头到尾重新输入一次。剪切和复制还有命令历史记录可以有一些帮助,但不多,特别是开始写更大程序时。要从交互式会话中剪切和粘贴代码,必须删除 Python 提示符,程序输出等等 —— 这并不是现代软件的开发方法! 要永久保存程序,需要把代码写在文件中,它们通常被称作模块。模块仅仅是包含 Python 语句的文本文件。一旦被编码,就可以要求 Python 解释器去任意次数的执行这种文件中的语句,且有许多种方式 —— 通过系统命令行,通过点击文件图标,通过 IDLE 用户界面的选项等等。不管它是如何被运行的,在每次运行文件时,Python 从上往下地执行模块文件中的所有代码。 本领域中的术语可能有些不同。比如,模块文件通常在 Python 中被称作程序 —— 即,程序被认为是存储在文件中的一系列预编码的用于重复执行的语句。被直接运行的模块文件有时也被称为脚本 —— 一个不正式的术语,通常意外着顶层的程序文件。一些人保留了 “模块” 这个术语用于从另一个文件导入的文件,“脚本” 用于程序的主文件;我们这里大致也是如此(不过需要继续关注本章后面的 “顶层” 导入和主文件的含义。) 不管怎么叫,后面的几章探索了运行模块文件中代码的方式。在本节,将学习如何以最基本的方式运行文件:在电脑的系统提示符那里,在一个 <font style="color:rgb(133, 128, 128);background-color:rgb(249, 250, 250);">python</font> 命令中列出他们的名字。虽然这样对一些人显得原始 —— 且通常可以通过使用如 IDLE 之类的 GUI(随后讨论)来完全避免 —— 但对许多程序员来说,系统 shell 命令行窗口,和文本编辑器窗口一起构成了在任何时候所需要的尽可能多的集成开发环境,且提供了对程序的更多直接控制。 本文章首发在 LearnKu.com 网站上。

上一篇下一篇

Markdown 文本

纠错改进

系统命令行和文件——第一个脚本

让我们开始吧。打开你最喜欢的文本编辑器(比如,vi,notepad,或 IDLE 编辑器),输入下面的语句到一个名为 script1.py 的新的文本文件中,然后保存到之前设置的工作代码目录中:
  1. # A first Python script
  2. import sys # Load a library module
  3. print(sys.platform)
  4. print(2 ** 100) # Raise 2 to a power
  5. x = 'Spam!'
  6. print(x * 8) # String repetition
此文件是本书第一个官方的 Python 脚本(第 2 章那个两行的不算)。你不应该太担心此文件的代码,但作为一个简短的描述,此文件:
  • 导入了一个 Python 模块(提供额外工具的库),来获取操作系统平台的名称
  • 运行三个 <font style="color:rgb(133, 128, 128);background-color:rgb(249, 250, 250);">print</font> 函数调用,来显示脚本的结果
  • 使用名为 <font style="color:rgb(133, 128, 128);background-color:rgb(249, 250, 250);">x</font> 的变量,它在被赋值时被创建,来保存一个字符串对象
  • 应用将在下一章中学习的各种对象操作
这里 <font style="color:rgb(133, 128, 128);background-color:rgb(249, 250, 250);">sys.platform</font> 只是一个识别你工作电脑的类型的字符串;它位于一个名为 <font style="color:rgb(133, 128, 128);background-color:rgb(249, 250, 250);">sys</font> 的标准 Python 模块中,必须导入来加载(再说一次,后面会有更多关于导入的知识) 为了看起来色彩更丰富,在这里还添加了一些正式的 Python 注释 —— 在 # 号后的文本。之前提到过这些,但既然它们现在正出现在脚本中,就应该更加正式。备注能在行上单独出现,也可以在一行的代码右边出现。# 号后的文本被作为人类可读的注释而被简单地忽略且不被认为是语句语法的一部分。如果拷贝这个代码,可以忽略掉注释;它们只是提供信息的。在本书中,通常使用一个不同的样式来让注释在视觉上变得更加独特,但他们将作为代码中的普通文本出现。 再说一次,暂时不要关注此文件中的代码语法,后面都会学到的。要主要关注的是已经在文件中输入代码,而非在交互式提示符下。在这个过程中,已经编写了一个完全可工作的 Python 脚本代码。 注意名为 script1.py 的模块文件。因为对所有顶层的文件,它还可以被简单的命名为 script,但想导入客户端的代码文件则必须以 .py 后缀结尾。在本章后面将研究导入。因为可能想在未来导入它们,为编码的大多数 Python 文件使用 .py 后缀是个好主意。而且,一些文本编辑器通过 .py 后缀探测到 Python 文件;如果后缀不存在,可能不会获得如语法彩色化和自动缩进等功能。 本文章首发在 LearnKu.com 网站上。

上一篇下一篇

Markdown 文本

纠错改进

系统命令行和文件——使用命令行运行文件

一旦保存了文本文件,就可以通过列出它的完整文件名作为 <font style="color:rgb(133, 128, 128);background-color:rgb(249, 250, 250);">Python</font> 命令的第一参数来运行它,在系统 shell 提示符如下输入(不要在 Python 的交互式提示符下输入,如果没有正常工作,继续读到下一段落):
  1. % python script1.py
  2. win32
  3. 1267650600228229401496703205376
  4. Spam!Spam!Spam!Spam!Spam!Spam!Spam!Spam!
再说一次,可以在任何提供命令行入口的系统重输入这个系统 shell 命令 ——Windows 的命令提示符窗口,xterm 窗口,或类似的。但确保在保存脚本文件的同一个工作目录中运行(如果需要,先 “cd” 到那里),且确保在系统提示符运行,而不是 Python 的 “>>>” 提示符。还要记住如果 PATH 设置未被配置,要将命令中的单词 “python” 替换为之前使用过的完整目录路径,虽然这对 “py” Windows 启动器程序时不需要的,且可能在 3.3 和之后也不需要。 初学者还要注意:不要输入在之前部分中创建的 script1.py 源码文件中的任何文本。这个文本是一个系统命令和程序输出,不是程序代码。这里的第一行是用来运行源文件的 shell 命令,随后的行是这个源文件的 <font style="color:rgb(133, 128, 128);background-color:rgb(249, 250, 250);">print</font> 语句产生的结果。而且还要记住 <font style="color:rgb(133, 128, 128);background-color:rgb(249, 250, 250);">%</font> 代表了系统提示符 —— 不要自己输入它(不是啰嗦,但它是一个非常普遍的早期错误)。 如果所有的都按计划进行,这个 shell 命令会让 Python 逐行运行文件中的代码,且将看到脚本中三个 <font style="color:rgb(133, 128, 128);background-color:rgb(249, 250, 250);">print</font> 语句的输出 —— 底层平台的名称,2 的 100 次方和我们之前看到的同样字符串重复表达式的结果(再说一次,更多关于这后面两个的含义见第 4 章)。 如果并非全按计划进行,将得到一个错误信息 —— 确保完全按照文件中显示的代码输入,再尝试一次。下一部分有关于这个过程的额外选项和指引,且将在侧边栏 调试 Python 代码 中谈论调试选项,但在本书的这个时间点上,最好的选择很可能是机械模仿。 如果所有其他的方法都失败了,还可以尝试在之后讨论的 IDLE GUI(美化一些启动细节的工具,虽然有时比命令行模式要付出更多的控制器作为代价)下运行。 如果嫌拷贝太枯燥或容易出错,还从网络上获取代码示例,然而一开始输入一些代码会帮助学习如何避免语法错误。参见序言来获取如何获得本书示例文件的细节。

系统命令行和文件——命令行用法变化

因为这个方法使用了 shell 命令行来启动 Python 程序,所有常用的 shell 语法都适用。比如,可以通过使用特殊的 shell 语法将 Python 脚本的打印结果转到一个文件中保存以备随后使用或检查:
  1. % python script1.py > saveit.txt
在先前例子中出现的三个输出行,在本例中被保存到文件 saveit.txt 而不是被打印出来。这通常被称为流重定向;它适用于输入和输出文本且在 Windows 和类 Unix 系统上可用。这很适合测试,因为可以编写程序来监控其他程序输出中的变化。它还和 Python 关系不大,虽然(Python 简单地支持它),所以在这里将忽略掉关于 shell 重定向语法的进一步细节。 注:下面的都是 windows 平台上的细节,不再翻译 If you are working on a Windows platform, this example works the same, but the system prompt is normally different as described earlier:
  1. C:\code> python script1.py
  2. win32
  3. 1267650600228229401496703205376
  4. Spam!Spam!Spam!Spam!Spam!Spam!Spam!Spam!
As usual, if you haven’t set your PATH environment variable to include the full directory path to python, be sure to include this in your command, or run a change-directory command to go to the path first:
  1. C:\code> C:\python33\python script1.py
  2. win32
  3. 1267650600228229401496703205376
  4. Spam!Spam!Spam!Spam!Spam!Spam!Spam!Spam!
Alternatively, if you’re using the Windows launcher new in Python 3.3 (described earlier), a py command will have the same effect, but does not require a directory path or PATH settings, and allows you to specify Python version numbers on the command line too:
  1. c:\code> py 3 script1.py
  2. win32
  3. 1267650600228229401496703205376
  4. Spam!Spam!Spam!Spam!Spam!Spam!Spam!Spam!
On all recent versions of Windows, you can also type just the name of your script, and omit the name of Python itself. Because newer Windows systems use the Windows Registry (a.k.a. filename associations) to find a program with which to run a file, you don’t need to name “python” or “py” on the command line explicitly to run a .py file. The prior command, for example, could be simplified to the following on most Windows machines, and will automatically be run by python prior to 3.3, and by py in 3.3 and later—just as though you had clicked on the file’s icon in Explorer (more on this option ahead):
  1. C:\code> script1.py
Finally, remember to give the full path to your script file if it lives in a different directory from the one in which you are working. For example, the following system command line, run from D:\other, assumes Python is in your system path but runs a file located elsewhere:
  1. C:\code> cd D:\other
  2. D:\other> python c:\code\script1.py
If your PATH doesn’t include Python’s directory, you’re not using the Windows launcher’s py program, and neither Python nor your script file is in the directory you’re working in, use full paths for both:
  1. D:\other> C:\Python33\python c:\code\script1.py

系统命令行和文件——用法笔记:命令行和文件

从系统命令行运行程序文件时一个相当直接的启动选项,特别是如果之前工作中已经对命令行很熟悉。它也可能是运行 Python 程序的最可移植的方式,因为几乎每台电脑都有命令行和目录结构的某种概念。然而,对初学者,下面是关于常见初学者陷阱的一些指引,可以帮助你避免一些挫折:
  • 注意 Windows 和 IDLE 的自动扩展。如果使用 Notepad 程序来在 Windows 上编码程序文件,当到了保存文件时,小心选择类型 “所有文件”,且明确给文件 .py 的后缀。否则, Notepad 将用 .txt 后缀来保存文件(比如,如 script1.py.txt),这让使用一些方案变得困难;比如,这样将无法导入。
更糟的是, Windows 默认隐藏了文件扩展名,所以除非已经修改了视图选项,可能甚至没有注意到编码了一个文本文件而不是 Python 文件。文件的图标可能会暴露这一点 —— 如果它上面没有某种蛇,可能就会有麻烦了。在 IDLE 中未着色的代码和当点击时文件被打开来编辑而非运行则是这个问题的其他症状。 微软 Word 类似地默认添加了 .doc 后缀;更糟得多的是,它添加了那些不符合 Python 语法的格式化字符。作为一个经验法则,在 Windows 下保存时总是选择 “所有文件”,或使用更编程友好的文本编辑器如 IDLE。IDLE 甚至不会自动添加 .py 后缀 —— 一个并不是所有程序员都喜欢的功能。
  • 在系统提示符使用文件扩展名和目录路径,但在导入时不要使用。在系统命令行不要忘记键入文件的完整名称 —— 也就是,使用 <font style="color:rgb(133, 128, 128);background-color:rgb(249, 250, 250);">python script1.py</font> 而非 <font style="color:rgb(133, 128, 128);background-color:rgb(249, 250, 250);">python script1</font>。作为对比,Python 的 <font style="color:rgb(133, 128, 128);background-color:rgb(249, 250, 250);">import</font> 语句(我们将在本章后面学习)忽略了 .py 文件后缀和目录路径(比如,<font style="color:rgb(133, 128, 128);background-color:rgb(249, 250, 250);">import script1</font>)。这可能看起来不重要,但搞混这两个是常见错误。
系统提示符是在系统 shell 中,不在 Python 中,所以 Python 的模块文件搜索规则不适用。因此必须包含 .py 扩展名和(如果必要)希望运行的文件的完整目录路径。比如,要运行一个不在当前目录中的文件,通常需要列出其完整路径(比如,<font style="color:rgb(133, 128, 128);background-color:rgb(249, 250, 250);">python d:\test\spam.py</font>)。然而,在 Python 代码中,可以只是说 <font style="color:rgb(133, 128, 128);background-color:rgb(249, 250, 250);">import spam</font> 然后依赖于 Python 模块搜索路径去定位文件,后面会讲到。
  • 在文件中使用** `print` **语句。是的,这个已经讨论过了,但它是如此常见的一个错误以至于值得至少在这里再重复一次。不像在交互式编程中,通常必须使用 <font style="color:rgb(133, 128, 128);background-color:rgb(249, 250, 250);">print</font> 语句来查看程序文件的输出。如果没有看到任何输出,确保在文件中已经说了 “print”。 <font style="color:rgb(133, 128, 128);background-color:rgb(249, 250, 250);">print</font> 语句在交互式会话中不是必须的,因为 Python 会自动回显表达式结果; <font style="color:rgb(133, 128, 128);background-color:rgb(249, 250, 250);">prints</font> 不会在这里造成困难,但它是多余的输入。
本文章首发在 LearnKu.com 网站上。

上一篇下一篇

Markdown 文本

纠错改进