zoukankan      html  css  js  c++  java
  • Python语法速查: 15. 解释器与执行环境

    返回目录

    本篇索引

    (1)Python解释器

    (2)Python交互式会话

    (3)运行Python程序

    (4)解释器内置类型

      (1)Python解释器

    ● 基本用法

    Python解释器可以在命令行模式下运行,以下是运行语法:

    python [options] [-c cmd | filename | - ] [args]

    若指定filename,则Python解释器将打开指定文件并执行其语句,直到文件结束标志; 若filename未指定,则进入“交互式会话”。

    -c cmd选项可用于以命令行选项形式执行短程序,如:python -c "print('hello')"

    args参数将通过sys.args传递给程序,程序中可读出这些参数。

    以下是常用 [options] 选项

    选项说明
    -B 阻止在导入时创建 .pyc 或 .pyo 文件
    -E 忽略环境变量
    -h 打印所有可用命令行选项的列表
    -i 在程序执行后进入交互模式(对调试很有用)
    -m module 以脚本的形式运行库模块 module
    -O 优化模式
    -OO 优化模式,在创建 .pyo 文件时删除文档字符串
    -s 阻止将用户站点目录添加到 sys.path
    -S 阻止包含 site 初始化模块
    -t 报告关于不一致的制表符使用警告
    -tt 由于不一致的制表符使用而导致 TabError 异常
    -u 未缓冲的二进制 stdout 和 stdin
    -U 在Python2中,使所有字符串字面量都以 Unicode 形式处理(Python3中无效)
    -v 详细模式,跟踪导入语句
    -V 打印版本号并退出
    -x 跳过源程序的第一行
    -c cmd 以字符串形式执行 cmd

    ● 环境变量

    Python启动时,会从操作系统中读取一些环境变量(如果有),以下是一些常用的环境变量:

    环境变量说明
    PYTHONPATH 以冒号分隔的模块搜索路径,在Windows上,还可以从 HKEY_LOCAL_MACHINE/Software/Python 的注册表项读取
    PYTHONSTARTUP 在以交互方式启动时执行的文件
    PYTHONHOME Python的安装位置
    PYTHONINSPECT 相当于 -i 选项
    PYTHONBUFFERED 相当于 -u 选项
    PYTHONIOENCODING 针对 stdin, stdout, stderr 的编码和错误处理,这是一个 encoding[:errors] 形式的字符串,如:utf-8:ignore
    PYTHONDONTWRITEBYTECODE 相当于 -B 选项
    PYTHONOPTIMIZE 相当于 -O 选项
    PYTHONNOUSERSITE 相当于 -s 选项
    PYTHONVERBOSE 相当于 -v 选项
    PYTHONUSERBASE 每个用户站点包的根目录
    PYTHONCASEOK 指示对导入所使用的模块名称使用不区分大小写的匹配方式

      (2)Python交互式会话

    如果没有给定程序名称,并且Python解释器的标准输入为一个交互式终端,Python将在交互模式下启动。 在这种模式下,解释器会执行PYTHONSTARTUP环境变量(如果有)中包含的脚本。 该脚本将作为输入程序的一部分执行(即无需使用 import 语句加载它)。 该脚本的第一项应用就是读取用户配置文件,如 .pythonrc。

    可以修改sys.ps1sys.ps2的值来更改提示符。

    在交互模式下,最后一次运算的结果存储在特殊变量_中。可以在交互模式中使用这个变量。如:

    >>> 1 + 2
    5
    >>> _ + 3
    >>> 6

    默认情况下,交互模式下运行的结果会在屏幕上全部打印出来。通过将变量sys.displayhook设为自定义函数, 可以省略显示运行结果,下面是一个例子,对于要显示结果大于40个字符的结果,省略显示其中的中间部分:

    >>> def my_display(x):
    ...     r = repr(x)
    ...     if len(r) > 40: print(r[:40] + '...' + r[-1])
    ...     else: print(r)
    >>> sys.sisplayhook = my_display
    >>> list(range(100))
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1...]
    >>> 

      (3)运行Python程序

    ● 启动Python应用程序

    在Linux环境下,有以下2个方法可以自动启动Python解释器来执行 .py 文件,

    方法一:通过chmod增加x属性的方法

    方法二:可在.py文件头部指定Python解释器名称, 如: #!/usr/bin/python3

    在Windows环境下,双击:.py, .pyw, .wpy, .pyc, .pyo 将自动启动Python解释器。 通常,程序在控制台窗口中运行,若使用了.pyw 后缀对它们进行了重命名,程序将静默运行。 如果要为解释器提供选项,Python也可以从一个 .bat 文件启动。

    ● 程序终止

    当出现以下情况时,程序将会终止:输入程序中没有可执行的其他语句时、 出现未捕获的 SystemExit 异常(由sys.exit()生成), 解释器收到SIGTERMSIGHUP信号时。

    程序退出时,解释器减小当前已知命名控件中所有对象的引用计数(同时销毁每个命名空间)。 如果一个对象的引用计数达到0,将销毁该对象并调用其__del__()方法。 但是若对象之间存在循环引用,就可能在程序终止时不会调用这个对象的__del__(), 所以这时需要显式清除某些对象(比如已打开的文件或网络套接字); 或者利用垃圾回收器来完成这个工作。

    用户可以编写一个终止函数并将其注册到 atexit 模块,用户可以用法示例如下:

    import atexit, gc
    
    def cleanup():
        print('before program exit...')
        gc.collect()    # 调用垃圾回收器来完成清除工作
        
    atexit.register(cleanup)

    有时候希望不执行任何清除操作而终止程序执行,这可以同通过调用os._exit(status)来完成。 该函数提供了针对底层 “exit()系统调用”的接口,调用该函数时,程序将立即终止, 而且不会执行任何进一步的清除操作。

    ● site配置文件

    (1)第三方站点目录

    一般Python的第三方模块和包(比如通过 pip 安装的包)会被安装到 site-package 目录下, 这个目录称为第三方站点目录。在第三方站点目录中安装的包,所有用户都能使用。 在Linux中,这个目录一般在形如:/usr/local/lib/python3.7/site-package 的地方; 在Windows中,这个目录一般在形如:Python安装目录Libsite-packages 的地方。

    当向第三方站点目录安装包时,如果该包已经存在于用户站点目录中,pip则会通知你该包已安装。

    (2)用户站点目录

    用户也可以安装仅供自己使用的包(其他用户不能使用),这可以在 pip 安装(或setup.py安装)时, 通过参数 --user 实现,如:pip3 install --user numpy。 在Linux中,这个目录一般在形如:~/.local/lib/python3.7/site-package 的地方; 在Windows中,这个目录一般在形如:%APPDATA%PythonPython37site-packages 的地方。

    (3)site模块

    当在程序中使用import语句时,Python会使用sys.path中指定的目录来搜索模块, 而这个sys.path内容的初始化,是通过 site 模块完成的。

    Python解释器启动时,首先会导入 site 模块,它先导入第三方站点目录和用户站点目录, 并将这些目录添加到sys.path中。然后在这些目录中搜索路径配置文件(具有 .pth后缀的文件), 将这些配置中的路径也一一添加到sys.path中(如果该路径存在的话)。

    路径配置文件中的每个目录都必须在单独一行列出,注释和空行将被忽略,重复的项目仅添加一次。 路径配置文件中的每行可以是:目录、zip文件 或 .egg 文件。

    用户甚至还可以编辑 site.py 的源码,用于完成自己一些独特的配置需求。这个文件一般位于 /usr/lib64/python3.7/ 目录下。

     

      (4)解释器内置类型

    用户一般很少需要直接操作解释器内部使用的对象,但是Python也将它们暴露给用户, 如果是设计框架或工具构建可能会用到这些解释器内部对象。

    解释器内置类型

    类型名称说明
    types.CodeType 字节编译代码的类型
    types.FrameType 执行帧的类型
    types.GeneratorType 生成器对象的类型
    types.TracebackType 异常的栈跟踪的类型
    slice 由扩展切片生成的类型
    Ellipsis 在扩展切片中使用

    ● 代码对象

    代码对象又叫字节码(bytecode),代表编译过的可执行代码,通常由内置的compile()函数返回。 一个代码对象可以保存若干个函数,只是它们不绑定到特定函数(即不保存命名空间相关的上下文信息)。

    代码对象具有以下只读属性:

    属性说明
    c.co_name 函数名称
    c.co_argcount 位置参数个数(包括默认值)
    c.co_nlocals 函数使用的局部变量个数
    c.co_varnames 包含局部变量名称的元组
    c.co_cellvars 包含嵌套函数所引用的变量名称的元组
    c.co_freevars 包含嵌套函数所引用的自由变量名称的元组
    c.co_code 表示原始字节码的字符串
    c.co_consts 包含字节码所用字面量的元组
    c.co_names 包含字节码所用名称的元组
    c.co_filename 被编译代码所在文件的名称
    c.co_firstlineno 函数的首行行号
    c.co_lnotab 字符串编码字节码相对于行号的偏移
    c.co_stacksize 所需栈的大小(包括局部变量)
    c.co_flags 包含解释器标志的整数

    ● 帧对象

    帧对象用于表示执行帧,多出现在跟踪对象中。

    帧对象具有以下属性:

    属性说明
    以下为只读属性
    f.f_back 上一个栈帧(对当前调用者而言)
    f.f_code 正在执行的代码对象
    f.f_locals 局部变量的字典
    f.f_globals 全局变量的字典
    f.f_builtins 内置名称的字典
    f.f_lineno 行号
    f.f_lasti 当前指令。这是f_code字节码字符串的索引
    以下为可修改属性
    f.f_trace 在每行源代码起始处调用的函数

    ● 跟踪对象

    出现异常时就会创建跟踪对象,它包含栈跟踪信息。进入异常处理程序后,可以使用sys.exc_info()函数来获取栈跟踪信息。

    跟踪对象具有以下只读属性:

    属性说明
    t.tb_next 栈跟踪的下一级(朝发生异常的执行帧方向深入)
    t.tb_frame 当前级别的执行帧对象
    t.tb_lineno 出现异常的行号
    t.tb_lasti 当前级别中正在执行的指令

    ● 生成器对象

    生成器对象即通过调用含有yield语句的函数创建的对象。生成器对象有2个用途,一是迭代器、二是容器。

    生成器对象具有以下属性:

    属性说明
    g.gi_code 生成器函数的代码对象
    g.gi_frame 生成器函数的执行帧
    g.gi_running 显示生成器函数目前是否正在运行的整数

    ●切片对象

    切片对象用于表示在扩展切莫语法中指定的切片,如a[i:j:stride], a[i:j, n:m]等。 使用内置的slice()函数也可以创建切片对象。

    切片对象具有以下只读属性和方法:

    属性或方法说明
    s.start 切片的下边界,如果省略则为None
    s.stop 切片的上边界,如果省略则为None
    s.step 切片的步长,如果省略则为None
    s.indices(length) 接收一个长度参数,返回一个元组 (start, stop, stride),用于表明如何将切片应用到指定长度的一个序列

    ●Ellipsis对象

    用于索引查找[]中省略号是否存在,通过内置名称Ellipsis可以访问这种类型的对象。它没有任何属性,但并不是空(若对其应用判断表达式,其值为True)。 Python中没有任何内置类型使用了Ellipsis,但如果要在自己创建的对象上的索引运算符[]中构造高级功能,就可以用到它。

    下面的代码说明了如何使用Ellipsis对象:

    class Example(object):
        def __gettiem__(self, index):
            print(index)
            
    e = Example()
    e[3,...4]     # 内部调用形式为:e.__gettiem__((3,Ellipsis,4))

     

    返回目录

  • 相关阅读:
    经典网络还是VPC,开发者作何选择?
    经典网络还是VPC,开发者作何选择?
    文件系统的几种类型:ext3, swap, RAID, LVM
    文件系统的几种类型:ext3, swap, RAID, LVM
    ★商场上的十则寓言故事!
    ★商场上的十则寓言故事!
    【★】自制网络心理需求大排名!
    【★】自制网络心理需求大排名!
    自制mpls ldp实验
    自制mpls ldp实验
  • 原文地址:https://www.cnblogs.com/initcircuit/p/12216558.html
Copyright © 2011-2022 走看看