上一篇《python由浅入深-开胃菜,吊起你的胃口》我们讲到了解释器,它是脚本语言能够执行的核心,也是一种编程语言被称为脚本语言的原因所在。




python 应用商店 输入python打开应用商店_Python

深入python




官方文档:使用Python解释器

1.调用解释器

Python解释器通常以 /usr/local/bin/python3.8的形式安装在机器上;将/usr/local/bin放在Unix shell的搜索路径中,就可以在shell环境里通过键入以下命令来启动它

python3.8

由于选择解释器所在的目录是一个安装选项,所以可以选择其他位置;请找你身边的Python高手或大佬聊聊。(例如,/usr/local/python 是一个流行的备选位置。)

解说:解释器其实也是程序,它也有自己的默认安装路径,当然也可以自己指定路径。解释器也是由一些文件组成,也有运行入口-主程序。我们运行脚本,就是在运行这个主程序时把我们的代码传给它,由它执行我们代码里的指令。

python3.8是解释器的主程序,linux系统里它通常在/use/local/bin/目录下,也有的在 /use/bin/目录下,安装时可以自己指定。

在linux下直接输入一个命令,操作系统的shell是怎么知道你输入的是不是、又是哪个命令呢?其实背后有一个目录列表,shell会在里面一个个目录下查找可执行文件,该目录列表通常存在环境变量PATH里,可以这样查看里面具体保存了哪些目录:

echeo $PATH

把你的可执行脚本、程序放在其中某个目录下,然后你就可以在任意位置执行你的脚本、程序了。


官方文档:

在Windows上,从微软商店安装Python后,python3.8命令就可以用。如果你有已经安装的py.exe文件启动器,就可以使用py命令。在附录里可以找到: 通过设置环境变量来用其它方式启动Python。

解说:微软的新windows系统,可以直接从微软商店安装,但是也可以自己到python官网下载安装包来装。

在windows下,python解释器也是一个普通软件,它也是由好多文件组成。默认往往装在系统盘C盘,你也可以安装到其它目录,就像安装其它一般软件一样。


官方文档:

在主提示符处键入文件结束字符(Unix上为Control-D,Windows上为Control-Z)将使解释器返回零状态码后退出。如果那种方式不起作用,你可以通过输入下面这个命令来使解释器退出: quit()

解说:命令行下直接不带任何参数运行解释器主程序,或图形界面里双击解释器程序文件(那个蟒蛇图像图标的可执行程序),会进入一个命令行环境,光标停在一个 $ 符号后面,这个$符号便是python解释器的主提示符:它在等待你在后面输入python命令。

初次进入命令行环境的人往往不知道怎么退出,被“关”在黑窗口的世界里... 退出python命令行环境很简单:windows的电脑里按住键盘上的Ctrl键同时按下字母Z键盘就可以了;linux和苹果电脑按住Ctrl的同时按下D就可以了。也有一个方式在每种电脑下都能用,用命令来执行退出:输入quit() 然后按回车键。

文件结束符,通常情况下是一个不可见的字符,专业程序员间有时为了便于阅读交流,会用“EOF”来表示它,它是 End Of File的缩写。在传输字符的设备、连接上,当遇到这个特殊字符时表示一个文件结束了-就像我们关闭了一个文件。


官方文档:

在支持GNU Readline库的系统上,解释器的行编辑特性包括:交互式编辑、历史替换,和代码补全。查看自己的编辑器是否支持行编辑特性的最快检查方法可能是:在第一个Python提示符下键入Control-P。如果它发出嘟嘟声,则表示您可以使用命令行编辑特性。有关这方面操作键的介绍,请参阅python手册附录“交互式输入编辑和历史替换”。如果没有出现任何情况,或者 ^P 被回显,则命令行编辑特性不可用;您只能使用键盘上的回退键(backspace)从当前行中删除字符。

解说:python语言诞生于unix/linux操作系统,因此它的解释器默认情况下对这些环境下的操作支持友好些。

GNU是一套开源操作系统及其软件的集合,Readline便是其中优秀的一款,专门用来处理行数据的输入、读取、显示。很多开源软件都使用了readline来实现自己的基础功能,大多python解释器也有它- 但是Windows下可能没有哦。使用了readline的python解释器支持几个方便的功能:记录输入历史,后面可以快捷地使用之前输入过的命令;对于一些特别的命令单词,可以输入几个字母后利用补全功能快速输入,避免一个个字母地敲完;执行命令后立即显示命令的输出,自动再回到等待你输入命令的状态,如是反复...就像你在和电脑一人一句对话似的。




python 应用商店 输入python打开应用商店_Python_02

关注python背后




官方文档:

解释器的操作有点像unix/Linux的shell:当使用连接到tty设备的标准输入调用它时,它以交互方式读取和执行命令;当使用文件名参数或以文件作为标准输入调用它时,它从该文件读取并执行脚本。

解说:对话方式和解释器交互时,我们直接操作的设备通常称为终端,背后的python解释器也和终端设备连接,这些终端设备在操作系统里叫tty, 它是Teletypewriter的缩写,这个形象来源于早期的打字机。

交互模式不方便大批量的工作执行,无法做自动化工作。这时候就需要python解释器从电脑上的文件里直接读取代码,把结果也直接写到文件或屏幕上,不用一个个等待我们的输入。


官方文档:

启动解释器的第二种方法是

python -c 命令 [参数]…

它执行命令中的语句,类似于shell的-c选项。由于Python语句通常包含空格或对shell来说特殊的其他字符,因此通常建议用单引号将整个命令括起来。

解说:有时我们只是需要简单的执行些python命令,不想把代码写入文件,也不方便进入交互模式执行,比如在操作系统中别的shell里执行简单的python命令。这时候就可以用 python -c 的方式了。


官方文档:

有些Python模块也可以当作脚本来使用。可以用这样方式调用:

python -m module [参数]…

它执行模块的源文件,就像在命令行中拼出它的全名来调用一样。

当使用脚本文件时,能够运行脚本并随后进入交互模式有时是很有用的。这可以通过在脚本参数之前传递 -i 来实现。

所有命令行选项都在命令行环境中描述。

解说:像c/c++的标准库,只能当作基础部分引入自己的主代码里使用,不能独立作为程序编译使用,更无法独立运行。而python库里,有部分库甚至可以当作独立程序直接使用,而且非常实用。我自己常用的就有 :

python3 -m http.server

这行命令,轻轻松松就开启一个网站,将当前目录下的内容分享出去,支持文件浏览、下载。


官方文档:

2.1.1 参数传递

当解释器接受输入信息后,脚本名称和随后的附加参数将转换为字符串列表,并赋给sys模块中的argv变量。你可以通过执行 import sys来访问该列表。列表的长度至少为1;当没有给定脚本和参数时,系统argv[0]是空字符串。当脚本名称被指定为“-”(表示标准输入)时,系统argv[0]设置为“-”。当使用-c命令时,系统argv[0]设置为'-c'。当使用-m模块时,系统argv[0]设置为所定位模块的全名。在-c命令或-m模块之后找到的选项不会被Python解释器的选项处理程序所使用,而是留在sys.argv中,给后面的命令或模块去处理。

解说:这里讲的是我们调用python解释器时,参数是如何传递到脚本内部我们写的代码里的,python解释器在背后做了不少工作。标准库里还有个基础模块专门辅助解析处理各种形式的参数传输,以及在代码里获取它们的方式。

arvg是个数组,这个变量名很有传统,基本上所有语言的启动参数名都是它,在c/c++, java程序的入口函数,操作系统的一些shell脚本,比如bash, cshell里也常常可以看到它。


官方文档:

2.1.2 交互模式

当从tty读取命令时,解释器被称为处于交互模式。在这种模式下,它用主提示符提示你输入下一个命令,通常是三个大于号(>>>);对于连续行,它用第二个提示符提示,默认情况下是三个点(…)。在打印第一个提示之前,解释器将打印一条欢迎消息,说明其版本号和版权声明:

$ python3.8

Python 3.8.2 (v3.8.2:7b3ab5921f, Feb 24 2020, 17:52:18)

[Clang 6.0 (clang-600.0.57)] on darwin

Type "help", "copyright", "credits" or "license" for more information.

>>>

当输入多行结构的代码时,需要连续线。作为一个例子,看看下面的if语句:

>>>

>>> the_world_is_flat = True

>>> if the_world_is_flat:

... print("Be careful not to fall off!")

...

小心别掉下来!

有关交互式模式的详细信息,请参见交互式模式。

解说:在交互模式里,空闲情况下,为了避免迷茫,常常需要提示符,就是告诉你当前解释器处于什么状态。当看到行首是三个大于号时,就知道是等待输入一个独立语句的状态,如果看到三个连续点,那么当前处在等待输入连续几行的块语句状态,像 for,if语句,可能需要写几行,当输入第一行之后,在后继的行首就可以看到 “...”

如果这时候你不输入内容,直接敲入回撤键,则会结束块语句输入状态,返回上一级状态。

此处"别掉下来”,是提醒你在代码块的输入中,当提示符是... 时,注意避免不小心输入空行,那样就会退出块模式,结果你整个代码块就要重头输入了。


官方文档:

2.2 解释器及其环境

2.2.1 源代码编码
默认情况下,Python源文件被视为用UTF-8编码。在这种编码方式下,世界上大多数语言的字符都可以同时用于字符串文本、标识符和注释中——尽管标准库只使用ASCII字符作为标识符,这是任何可移植代码都应该遵循的约定。要正确显示所有这些字符,编辑器必须识别文件是UTF-8编码的,并且必须使用支持文件中所有字符的字体。
若要声明默认编码以外的编码,应添加一个特殊的注释行作为文件的第一行。语法如下:
# -*- coding: encoding -*-
其中encoding是python支持的有效编解码之一。
例如,要声明使用Windows-1252编码,源代码文件的第一行应该是:
# -*- coding: cp1252 -*-
第一行规则的一个例外是源代码以UNIX “shebang” (#!)行开头。在这种情况下,应该将编码声明添加为文件的第二行。例如:
#!/usr/bin/env python3
# -*- coding: encoding -*-

解说:你在电脑里看到的字符,中文(繁体、简体)、英文、日文、阿拉伯文... 都是不同文化里千变万化的文字符号,但是在计算机底层-内存里、CPU的寄存器里、传输的网线里、磁盘上... 都会被翻译成统一的符号:0或1。那么多不同的字符怎么翻译成0、1两种符号,还要保留信息,这就是字符编码解决的问题。存在很多种编码规则,现在主流的是utf8编码,它把世界上几乎所有已知语言的文字符号,都进行了唯一编码。

电脑是西方世界发明的,西方文字是基于字母组合的,基础字母很少,加上一些常用符号,也不过两百多个。因此早期电脑里的字符编码也只解决这不多的字符翻译成01串的工作,它们就是ASCII编码。它只包括了大小写英文字母,英文书面语言里的标点符号,以及一些常用的数学符号。

随着计算机的发展、普及,世界上各行各业,各个国家、不同文化都开始深度使用计算机,各种语言文字都需要通过电脑处理、传输,甚至许多非语言文字的固定符号也在电脑中频繁地使用-比如表情包。全球化中,跨国、跨语言文化的交流日益常见,因此需要一套统一的编码把所有文字、常用符号都进行编码-用唯一的0、1串表示...

这就是统一编码的需求,但现实的发展中,各个国家、文化团体各自制定了不少了自己的编码。中文知名的是GB2312,还有windows常用的cp1252。

那么我们敲入的python代码是作为什么编码存在文件里,又用什么编码从文件里读出来呢?

这方面python解释器也作了一个规则:代码文件的首行按照固定的格式声明选用的编码。

如果指定用ACSII编码来写,那么在遇到中文等符号,就会变成乱码,可能会使程序不能正常运行。因此我们一般建议编程都用utf8编码来写代码。

首行声明代码文件编码的方式,在linux系统下有例外,因为linux文本文件首行还有一个留给系统潜规则::声明本文件是什么类型的脚本,从而让系统确定用什么解释器来运行本文件。这样python 解释器只好通过第二行来确定代码是用什么编码来写的了。




python 应用商店 输入python打开应用商店_命令行_03

深入python



#编程# #Python# #