# 解释器

# 起源

  • 1989 年圣诞节期间,荷兰人 Guido van Rossum 在参与研发了 ABC 语言之后,开始研发一种更好的脚本语言,命名为 Python 。

  • 按照 Python 语法编写的代码,如何执行?

    • Python 代码不需要编译,而是交给一种称为 Python interpreter 的程序来执行,中文名为 Python 解释器。
    • Python 代码主要有两种执行方式:
      • 可以用 Python 解释器打开一个交互式终端,手动输入一行 Python 代码,按下回车键,就会立即执行并显示结果。
      • 可以将多行 Python 代码保存为一个文件,然后用 Python 解释器执行。
        • 由于 Python 属于脚本语言,因此通常将 Python 的代码文件,称为脚本文件。
        • Python 脚本文件的扩展名通常为 .py 。

# 分类

存在多种 Python 解释器:

  • CPython
    • 基于 C 语言实现,是 Python 官方默认提供的一款解释器,用户量最大。
    • 执行 Python 脚本时,会先把它解释成 C 语言代码,再编译成可执行文件。
  • Jython
    • 基于 Java 实现。
    • 执行 Python 脚本时,会先把它解释成 Java 字节码文件,再编译成可执行文件。
  • PyPy
    • 基于 rPython 实现。
    • 采用 JIT 技术进行动态编译(不是解释),使代码的执行速度大幅提高。
  • IPython
    • 提供了功能更多的 shell ,常用作 Jupyter Notebook 的内核。

用户可执行以下代码,查看当前 Python 解释器的类型:

>>> import platform
>>> platform.python_implementation()
'CPython'

# 安装

  • 在 Window 上,要去官网 (opens new window)下载 Python 的安装包,运行它开始安装。

    • 安装时勾选“自动配置 PATH”。
    • 安装完成后,打开 Windows 的 CMD 窗口,执行 python 命令即可启动解释器。
  • 在 CentOS 上,可以用 yum 安装已编译的 Python ,缺点是只有旧版本的 Python 包:

    yum install python36 python36-pip
    ln -s /usr/bin/python3.6 /usr/bin/python3
    ln -s /usr/bin/pip3.6 /usr/bin/pip3
    
  • 在 Ubuntu 上,可以用 apt 安装已编译的 Python :

    apt install -y --no-install-recommends python3.8-dev python3.8-distutils
    
    • 如果嫌默认仓库提供的 Python 版本太旧,可添加一个由个人维护的仓库 ppa:deadsnakes (opens new window) ,它提供了最新几个版本的 Python 软件包:
      apt install -y software-properties-common   # 安装 add-apt-repository 工具
      add-apt-repository -y ppa:deadsnakes/ppa    # 添加 apt 仓库
      
  • 可以从官网 (opens new window)下载任意版本的源代码包,然后编译安装,缺点是比较慢:

    py_version=3.9.9      # 指定 Python 版本
    yum install -y gcc make openssl-devel zlib zlib-devel libffi-devel    # 安装编译工具及依赖库
    curl -O https://www.python.org/ftp/python/${py_version}/Python-${py_version}.tgz
    tar -zxvf Python-${py_version}.tgz
    cd Python-${py_version}
    ./configure --prefix=/usr/local/python/Python-${py_version} --with-ensurepip=install
    make
    make install
    cd ..
    rm -rf Python-${py_version} Python-${py_version}.tgz
    ln -s /usr/local/python/Python-${py_version}/bin/* /usr/local/bin/
    
    • 这里安装之后,执行 python3.8python3 即可启动解释器。(不过执行 python 启动的是 Python2 的解释器)
    • 在 Ubuntu 上,需要用 apt install -y gcc make openssl zlib1g-dev libffi-dev libssl-dev libbz2-dev libreadline-dev libsqlite3-dev liblzma-dev 安装编译工具及依赖库。
  • 或者运行 Docker 镜像:

    docker run -it --rm python:3.10.5-slim-buster python
    

# 命令

python                    # 打开 Python 解释器的终端
      -q                  # 打开解释器终端时,不显示帮助信息
      -v                  # 在启动、退出解释器时,显示详细信息
      -u                  # 输出 stdout 和 stderr 时不缓冲

      # 以下命令不会打开 Python 解释器终端
      -h                  # 显示帮助信息
      -V                  # 查看 Python 解释器的版本
      -c <command>        # 执行一条 Python 语句
      <xx.py> [args]      # 执行一个 Python 脚本,可以指定绝对路径或相对路径
      -m <module>         # 以脚本的方式执行一个 Python 模块

# 交互式编程

在系统终端执行 python 命令,会打开 Python 解释器的终端,可以交互式编程。

例:

[root@CentOS ~]# python3
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 1 + \
... 2
3
>>> print("Hello!"
...)
Hello!
  • 打开解释器终端时,开头会显示几行行帮助信息。
    • Python 3.7.3 表示该解释器的版本号。
    • Mar 25 2019, 22:22:05 表示该版本的发布时间。
    • 64 bit (AMD64) 表示该解释器是 64 位版本。
    • on win32 表示操作系统是 Windows 。
  • 三个大于号 >>> 是终端的主提示符,表示等待用户输入一行语句。
  • 三个小数点 ... 是终端的从属提示符,在输入换行时显示,表示等待用户输入多行语句。
  • 输入反斜杠 \ 再按回车就可以换行输入。
  • 使用括号 ()[]{} 时,在输入后半边括号之前,可以按回车换行输入。
  • 每条语句执行后,会自动将返回值显示在终端上。

# 执行脚本

  • 可以用 Python 解释器执行 Python 脚本,命令如下:

    python <filePath> [arg]...
    
    • 第一个字段是 Python 解释器的名称,比如:python3.8/usr/bin/python3.8
    • 第二个字段是 Python 脚本的路径,可以使用相对路径或绝对路径,比如:1.pytest/1.py
    • 如果文件路径中包含空格,就要加上双引号强调为字符串。比如:python "test/Hello world.py"
  • 当 Python 解释器执行脚本时,会在每个导入的模块的目录下生成一个 __pycache__ 文件夹,用于缓存该模块预编译生成的字节码文件(扩展名为.pyc 或.pyo)。

    • 当下一次执行脚本时,Python 解释器会检查被导入的模块是否有改动,没有的话就使用之前的 __pycache__ ,从而更快地执行。
    • .pyd 文件是用其它语言生成的扩展模块,可被 Python 导入。

# 相关概念

  • Jupyter Notebook

    • :一个 Web 服务器,提供了 Web IDE 。
    • 2014 年,IPython 解释器的 Notebook 项目改名为 Jupyter Notebook ,成为一个独立项目,扩展支持几十种编程语言。
    • 可以创建、编辑 Notebook 文档:
      • 支持多种编程语言的交互式编程。
      • 支持显示像 MarkDown 的富文本,方便绘制数学公式、编写教程文档。
      • 文档保存为 JSON 格式,扩展名为 .ipynb 。
  • Anaconda (opens new window)

    • :一个开源的 Python 语言、R 语言发行版,擅长数学运算、数据分析。
    • 于 2012 年发布。
    • Anaconda 的安装包有 1GB 体积,因为内置了 CPython 解释器、conda、pip、Jupyter Notebook 等工具。
    • Anaconda 提供了一个 GUI 界面,称为 Anaconda Navigator 。
  • conda