Python3 解释器
Linux/Unix的系统上,一般默认的 python 版本为 2.x,我们可以将 python3.x 安装在 /usr/local/python3 目录中。
安装完成后,我们可以将路径 /usr/local/python3/bin 添加到您的 Linux/Unix 操作系统的环境变量中,这样您就可以通过 shell 终端输入下面的命令来启动 Python3 。
$ PATH=$PATH:/usr/local/python3/bin/python3# 设置环境变量$ python3--versionPython3.4.0
在Window系统下你可以通过以下命令来设置Python的环境变量,假设你的Python安装在 C:\Python34 下:
setpath=%path%;C:\python34
交互式编程
我们可以在命令提示符中输入"Python"命令来启动Python解释器:
$ python3
执行以上命令后,出现如下窗口信息:
$ python3Python3.4.0(default,Apr112014,13:05:11)[GCC4.8.2]on linuxType"help","copyright","credits"or"license"formore information.>>>
在 python 提示符中输入以下语句,然后按回车键查看运行效果:
print("Hello, Python!");
以上命令执行结果如下:
Hello,Python!
当键入一个多行结构时,续行是必须的。我们可以看下如下 if 语句:
>>>flag=True>>>ifflag:...print("flag 条件为 True!")...flag条件为True!
脚本式编程
将如下代码拷贝至 hello.py文件中:
print("Hello, Python!");
通过以下命令执行该脚本:
python3 hello.py
输出结果为:
Hello,Python!
在Linux/Unix系统中,你可以在脚本顶部添加以下命令让Python脚本可以像SHELL脚本一样可直接执行:
#! /usr/bin/env python3
然后修改脚本权限,使其有执行权限,命令如下:
$ chmod+x hello.py
执行以下命令:
./hello.py
输出结果为:
Hello,Python!
我们 写一个最简单的python程序。 新建 first.py文件,文件内容如下:
print("First Hello World!")
新建 second.py
importfirstprint("Second Hello World!")
然后我们喜欢执行第二个文件:
python second.py
输出:
First Hello World!
Second Hello World!
python程序的执行过程
这个时候我们会发现生成了一个 pycache 目录; 目录下 有文件first.cpython-35.pyc。
如果python版本是2.x 则会在当前目录直接生成first.pyc。
我们说python是解释型语言 ,那这个pyc是什么文件呢?
按照一般的理解来说,pyc 中的c 应该是compile的意思, 既然是这样,那么python代码是如何被转换成一系列的机器指令呢?
现在我们就好好深究一下这里的因果关系。 其实本质上python和java、C#是一样的,三者的 程序执行原理都可以用两个词概括——虚拟机、字节码。
在python中有一个非常核心的东西——interpreter,当我们在命令行敲入python,当我们在shell中敲入命令python的时候, 目的就是为了激活这个解释器;
当我们执行 python second.py的时候,python解释器立即被激活,然后执行python程序。在pyhton的解释器还要完成一个非常重要的工作——编译.py文件。
python解释器在执行程序的时候,首先就是对文件中的python源代码进行编译,生成一个python的字节码(byte code),然后 将字节码交给python虚拟机,虚拟机则按照顺序一条一条的执行字节码,直到程序执行完。
上面在执行python second.py时,我们发现只有second.py文件生成了pyc文件,原因我们不知道,但是我们可以猜测python在执行的时候,只对需要编译的文件进行编译。
那什么是需要编译的文件呢? 比如说,first.py文件不只被 second.py调用, 还被其他的py文件调用,这个时候,如果把 first.py 进行编译,那下次就直接调用编译后的pyc文件,这样就加快了执行速度。
那么有人就要问了,如果我修改了first.py文件,下次调用first.pyc的时候不就不是最新的代码了吗,对于这个我们并不需要担心。
pyc文件中包含自身创建的时间,在python程序执行的时候,首先会尝试加载pyc文件,在加载的过程中,python会比对py文件和 pyc文件的时间,如果pyc文件时间早于py文件时间,就会重新编译py文件,生成新的pyc文件, 否则就会直接调用py从文件。
python整体架构
了解了python程序的执行过程,那么也应该了解python的整体架构是什么。 python的整体架构可以分为三个主要的部分。
左边的部分 python提供的大量模块、库 和用户自定义的模块。
中间的部分 python的核心——解释器,也可以叫虚拟机,这里的箭头方向是python运行过程中数据流的方向, Scanner对应词法分析,用来将文件或命令输入的每一行代码切分为一个个的token; Parser对应语法分析,在Scanner的分析结果上进行语法分析,建立抽象语法树(AST); Compiler 则根据建立的AST 生成指令集合——字节码; Code Evaluator 执行字节码文件,所以又被称为虚拟机。
右边的部分 对象/类型、内存分配 和解释器之间的箭头表示两者之间的“使用”关系; 运行时状态与解释器之间的箭头表示“修改”关系。python在执行的过程中会不断的修改当前解释器的所处的状态,在不同的状态之间切换。
python程序文件头部的 #!
#!/usr/bin/env python print("Hello World!")
Shebang 是一个由井号和叹号构成的字符串行(#!), 其出现在文本文件的第一行的前两个字符. 在文件中存在Shebang的情况下, 类Unix操作系统的程序载入器会分析Shebang后的内容, 将这些内容作为解释器指令, 并调用该指令, 并将载有Shebang的文件路径作为该解释器的参数。#!先用于帮助内核找到Python解释器, 但是在导入模块时, 将会被忽略. 因此只有被直接执行的文件中才有必要加入#!.
python2中文件的默认编码为ASCII,在文件中含有中文的时候就会报错,这时,我们需要是设置一下文件的默认编码,如下:
#!/usr/bin/env python
#-*- coding: UTF-8 -*- # 指定python文件编码方式
在python3中,文件的默认编码为UTF-8,已经不存在这个问题。
---