今天的文章需要使用到一个python文件,hello.py,我将其作为附件上传至本文章中,本项目由本人亲自逐一敲上电脑,请在开始阅读前下载它。
计算机有两种视图——在用户看来,一种视图只是拿起计算机查看文本、图像和图标。用户点击和输入,计算机根据他们的意愿做出反应。这是一个奇妙的故事,描述了数十亿普通人每天如何使用计算机创造令人眼花缭乱的成果。
但幕后是如何运作的呢?程序员的世界通过命令行将这一切整合在一起。
命令行
这是一个命令行的简单示例,在本例中运行称为“date”的命令,打印当前日期和时间(适用于 Mac 和 Windows)。
$ date Tue Oct 1 13:49:55 PDT 2019 $
使用命令行,计算机会输入提示符,此处显示为“$”,但通常更长,显示当前文件夹等信息。光标在提示符的右侧闪烁,等待用户输入内容。用户输入命令并按下回车键(又称 Enter 键)以运行该命令。在此示例中,粗体显示的是“date”命令。计算机接收用户输入的内容,运行它,将结果输出打印到屏幕上,然后再次显示提示符。
命令行通常被称为“终端”,因为这是早期连接到计算机的屏幕和键盘设备的名称。
下面,我们将展示如何从 PyCharm 中获取终端,这是我们常用的方法。请参阅本文档末尾的“创建命令行”,了解如何在没有 PyCharm 的情况下获取命令行。
示例项目文件夹:hello
对于下面的示例,您可以使用我们的“hello”项目。下载hello.py压缩文件。
文件夹中的终端
命令行始终在计算机上的文件夹上下文中运行,因此命令可以轻松访问该文件夹中的文件。普通用户在计算机上称之为“文件夹”,程序员使用较旧的术语“目录”,但两者是同一个东西——目录有名称并包含文件和子目录的集合。
如何在目录中获取命令提示符?PyCharm 中有一个非常简单的方法:
运行 PyCharm。选择“打开...”菜单命令。导航到上面解压的“hello”文件夹。单击 hello 文件夹并打开它(不要单击文件夹中的“hello.py”文件,令人恼火的是,它不能以相同的方式打开文件夹。一个常见的错误。)
打开 hello 项目后,点击左下角的“Terminal”选项卡,PyCharm 会在“hello”目录中创建一个命令行终端。该功能适用于 Mac 和 Windows。
在终端中,输入“ls”命令,该命令列出当前文件夹中的文件和目录的名称。(在较旧的 Windows 上,等效命令是“dir”。)这样,您可以确认命令行在正确的目录中运行。它应该如下所示(“$”表示在您输入之前打印的提示)。
$ ls
hello.py
向上箭头
一遍又一遍地输入整个命令行太麻烦了!有人说,懒惰是计算机科学的指导原则——安排好机器,尽可能避免工作。 在终端中,按向上箭头键——这应该会带回你之前的命令行。你可以左右箭头编辑此行,然后按回车键运行它。这是一个非常有用的功能,允许你检索刚刚执行的命令并进行一些编辑以尝试其他操作。
练习:使用向上箭头尝试不同的名称。(Mac/linux 的命令行键盘提示:ctrl-u 删除行,ctrl-a 和 ctrl-e 删除行首和行末。)
-n 选项
通常,当命令行参数以破折号开头时,如“-n”,它会为该命令启用某些选项。
例如,当使用 3 个命令行参数运行时,hello.py 会执行如下操作:hello.py -n a-number a-name
$ python3 hello.py -n 100 Alice
Alice Alice Alice Alice Alice Alice Alice Alice Alice Alice Alice Alice Alice Alice Alice Alice Alice Alice Alice Alice Alice Alice Alice Alice Alice Alice Alice Alice Alice Alice Alice Alice Alice Alice Alice Alice Alice Alice Alice
通常,命令行上的单词之间用空格分隔。将文本放在引号内以将其组合在一起,将其视为单个参数,如下所示:
$ python3 hello.py -n 10 "菲利普·K·迪克"
菲利普·K·迪克 菲利普·K·迪克 菲利普·K·迪克 菲利普·K·迪克 菲利普·K·迪克 菲利普·K·迪克 菲利普·K·迪克 菲利普·K·迪克 菲利普·K·迪克 菲利普·K·迪克 菲利普·K·迪克
练习:使用向上箭头尝试 -n 的不同名称和值。
另外:hello.py程序会让你的电脑崩溃吗?请参阅本页末尾的这个不合逻辑的问题。
记住向上箭头
我们只是粗略地介绍了如何运行程序,以及如何使用不同的参数以不同的方式运行程序。始终使用向上箭头返回上一个命令行进行编辑;只需从头开始输入一次命令!
查看文件和目录: ls pwd cat wc
此目录中有哪些文件?此文件中有什么?从计算机诞生之初,我们就需要命令来回答这些问题。Unix 操作系统中为这些命令选择的名称已逐渐流行,因此现在 Mac、Linux 和新的 Windows Power Shell 命令行都使用相同的名称支持这些命令。(Windows 备注:Windows 还有一个较旧的“命令 Shell”,它使用不同的名称 - 我们将在括号中提及这些名称。默认情况下,PyCharm 在 Windows 上会显示旧类型的 shell。)
命令ls
(“list”)列出了当前目录中的文件和子目录(旧的 Windows 命令是“dir”)。以下是在“hello”示例目录中运行的一个示例,该目录附带了我们在列表中看到的几个 .txt 文件:
$ ls
hello.py poem.txt spring.txt sub
$
该cat
命令将文件的内容打印到屏幕上:
$ cat poem.txt
玫瑰是红色的
紫罗兰是蓝色的
这不押韵
$
$ cat spring.txt
春天来了
秋天来了
冬天来了
而且比
平常冷
$
(Windows 中对此的旧命令是“type”。)
命令pwd
(“打印工作目录”)打印出当前目录的名称及其父目录。本质上它显示了当前目录在文件系统中的位置。(请参阅下面的“cd”以了解更改当前目录的命令。)
$ pwd
/用户/昵称/cs106a/code/hello
$
命令wc
(“字数统计”)计算并打印出组成文件的行数、字数和字符数:
$ wc 诗歌.txt
3 10 51 诗歌.txt
$ wc hello.py
43 149 991 hello.py
Windows 没有同名的“wc”命令。Power Shell 中该命令的等效内容是:
$ cat poem.txt | 测量对象-line-word-char
对 Unix 命令的一个公平批评是它们简短而隐晦。但是,通过上述内容,我认识到简短而隐晦的命令也易于输入。
poem.txt spring.txt sub
日历 -cal
这仅适用于 Mac Linux - 这是我经常使用的简单命令。“cal”命令会打印出当前月份的小日历。如果您提到年份,它会打印整整一年。
$ cal January 2022 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 $ cal 2022 2022 January February March Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa 1 1 2 3 4 5 1 2 3 4 5 2 3 4 5 6 7 8 6 7 8 9 10 11 12 6 7 8 9 10 11 12 9 10 11 12 13 14 15 13 14 15 16 17 18 19 13 14 15 16 17 18 19 16 17 18 19 20 21 22 20 21 22 23 24 25 26 20 21 22 23 24 25 26 23 24 25 26 27 28 29 27 28 27 28 29 30 31 30 31 April May June Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa 1 2 1 2 3 4 5 6 7 1 2 3 4 3 4 5 6 7 8 9 8 9 10 11 12 13 14 5 6 7 8 9 10 11 10 11 12 13 14 15 16 15 16 17 18 19 20 21 12 13 14 15 16 17 18 17 18 19 20 21 22 23 22 23 24 25 26 27 28 19 20 21 22 23 24 25 24 25 26 27 28 29 30 29 30 31 26 27 28 29 30 ... and so on ... $
更改目录 cd
命令行在当前目录中运行,可以轻松访问这些文件。通常,我们会在包含 Python 和数据文件的目录中创建一个终端,并且永远不会更改它。
如果需要,cd
命令(“更改目录”)会更改命令行的目录。该命令将当前目录更改为指定的目录。特殊目录名称“..”(两个点)表示父目录。使用“pwd”我们可以检查我们所在的位置。 cd dir-name
专家提示:输入目录名称是一件苦差事,而且容易出错。输入名称的前几个字符,然后按 Tab 键 — 命令行将尝试自动完成名称的其余部分。这可以节省工作量,而且更准确,因为自动完成功能始终会正确输入名称。
假设命令行位于“hello”文件夹中,其中包含一个名为“sub”的子目录。则以下命令将命令行向下移动到子目录中:
# pwd # 验证我们是否在“hello”目录中
/Users/nick/cs106a/code/hello
$ ls # 在 hello 目录中,列出文件
hello.py poem.txt spring.txt sub
$ cd sub # 移至子目录
$ pwd # pwd 移至此处的 sub
/Users/nick/cs106a/code/hello/sub
$ ls # 列出 sub 中的文件
a.txt b.txt c.txt
$ cd .. # 返回到 hello 目录
使用“cd”,您可以将命令行移动到文件系统中的任何位置。输入每个目录名称时,请记住使用制表符补全。
使用 > 捕获输出
您使用不同的参数运行程序,会看到不同的输出。最终,您希望将文本输出捕获到文件中。有一种非常简单的方法可以做到这一点:> out.txt
在命令行的右侧添加。这会再次运行命令,但不会在屏幕上打印输出,而是将输出捕获到文件中。
$ python3 hello.py -n 10 "Philip K. Dick" > philips.txt
$ ls # 现在 philips.txt 文件存在
hello.py philips.txt poem.txt spring.txt
$ cat philips.txt
Philip K. Dick Philip K. Dick Philip K. Dick Philip K. Dick Philip K. Dick Philip K. Dick Philip K. Dick Philip K. Dick Philip K. Dick Philip K. Dick Philip K. Dick Philip K. Dick
不使用 PyCharm 创建命令行
在 PyCharm 中创建命令行终端是一种简单的方法。但是,您也可以不使用 PyCharm 来做到这一点:
在 Mac 上:打开“应用程序”>“实用程序”>“终端”。这将创建一个从主目录开始的命令行。假设您有一个名为“courses”的文件夹,其中有一个名为“cs106a”的文件夹。您可以使用命令cd courses
,然后cd cs106a
将终端移动到 cs106a 文件夹内。
在 Windows 上:在要在其中运行命令行的文件夹上打开文件资源管理器窗口。在文件顶部以外的区域按住 Shift 键并单击鼠标右键。选择“在此打开 PowerShell 窗口”菜单选项以从该文件夹开始创建终端。
无论哪种情况,您都可以使用命令“cd”、“ls”和“pwd”来检查有哪些文件并更改目录。
定时运行命令
测量运行命令需要多少秒非常方便。在大多数系统中,该time
命令会执行此操作(wordcount.py 是后几周的 CS106A 示例):
$ time python3 wordcount.py alice-book.txt
...
-此处输出我们忽略-
...
real 0m0.135s
user 0m0.112s
sys 0m0.015s
这里,在常规输出后打印的“real 0.135s”表示常规时钟时间,即该命令运行期间经过的 0.135 秒,即 135 毫秒。
Windows PowerShell 相当于对命令的运行时间进行计时:
$ Measure-Command { python wordcount.py alice-book.txt }
停止程序-ctrl-c
如何在程序运行时停止它?也许你的程序有错误,产生大量输出,你只想让它停止。从命令行的早期开始,在程序的终端中输入ctrl-c就可以在程序运行中停止程序(“c”代表“取消”)。
如果您hello.py
正常运行,它会很快完成,您将没有机会停止它。因此,您需要为 -n 参数提供一个非常大的值,例如 1000 万,以尝试 ctrl-c。
$ python3 hello.py
-n
10000000
Bob
...
main()
文件“hello.py”,第 36 行,在主程序中
print(name, end=' ')
KeyboardInterrupt
$
程序运行,产生无数的 Bob,但随后键入 ctrl-c 会中断并终止程序运行,然后我们得到一个新的命令行提示符。KeyboardInterrupt
最后你会看到 Python 术语,用于描述以这种方式中断的程序。
不合逻辑的推断:hello.py崩溃了?
这是关于 hello.py 程序的一个问题,我一直对此感到好奇,但我从来没有勇气去弄清楚,所以我就把它作为一个问题留下来。当 hello.py 运行并打印到终端时,你的计算机可能将所有文本保存在某个地方。每个字符占用一个字节。问题:如果你运行带有数字 9 万亿的 hello.py 命令会发生什么:
$ python3 hello.py -n 9000000000 "Winter Is Coming"
# 这里发生了什么?我不知道
这是否会导致计算机在某个时候锁定,因为它用尽了内存或磁盘空间来存储所有文本?或者也许终端程序在某个时候开始丢弃文本以保存自身。或者也许这个过程太慢了,人们在它进行到足以让一些有趣的事情发生之前就失去了兴趣。在 Mac 上,使用活动监视器,在 Windows 上,使用任务管理器来查看计算机上正在发生的事情。