Skip to content

Latest commit

 

History

History
189 lines (135 loc) · 4.64 KB

209-542737-是否为主模块_name_main.sy.md

File metadata and controls

189 lines (135 loc) · 4.64 KB
show version enable_checker
step
1.0
true

当前模块名(__name__=='__main__')

回忆

  • 上次研究了python类库的来源
    • 系统内置
    • 类库目录
  • 把py程序放到python类库列表中
    • py程序就成一个类库包
      • 可以直接运行此程序
      • 也可以作为类库导入次程序

图片描述

  • 那我怎么知道 当前的py文件
    • 是 引入的模块
    • 还是 主控的程序 呢🤔

构建程序

print("in oeasy.py __name__ is ",__name__)
  • 输出 当前 上下文的__name__

图片描述

  • oeasy作为主程序的时候
    • __name__变量的值是__main__
    • 注意这里是两个下划线
  • 如果oeasy作为一个被引入的模块呢?

图片描述

  • oeasy作为一个被引入的模块时
    • __name__变量的值是oeasy
    • 而不是__main__
  • 什么是__name__呢?

游乐场

  • 观察

图片描述

  • __name____doc____builtins__一样
  • 是全局变量

图片描述

  • 通过__name__这个变量的值
    • 可以知道当前py文件
    • 是不是主模块(或者说入口模块)
    • 或者说是顶级代码环境
  • 如何理解这个顶级呢?

顶级代码环境

  • 以下两种运行方式中
    • oeasy.py就是顶级模块
python3 -m oeasy
python3 oeasy.py
  • 顶级的就是说这个模块
    • 是我们用python直接运行的
    • 别的都是运行过程中
    • 直接或者间接被顶级模块调用的模块

图片描述

具体判断

  • 判断__name__ 属性是否为 __main__
  • 如果结果True
    • 就是顶级代码级别
    • 就是要直接运行当前文件
    • 就执行 if __name__ == '__main__' 中的代码
  • 如果结果False
    • 就不是顶级代码级别
    • 就是要把当前文件作为模块导入
    • 就不执行 if __name__ == '__main__' 中的代码

图片描述

python3 o2z.py
  • 在上述命令中
    • 由于导入了 oeasy.py
  • 在运行 oeasy.py时
    • __name__ 就是 oeasy
    • 而不是__main__
    • oeasy.py 就不是 顶级模块
    • top-level module
  • 如果模块名是个文件夹会如何呢?

自制模块文件夹

图片描述

  • 可以自制模块
    • __main__.py就是模块的入口地址
  • __main__可以是具体的py文件

动手

图片描述

  • __main__.py就是模块的入口地址
  • 这个和__init__.py有什么不同呢?
  • 对于文件夹来说
    • 先初始化__init__.py
    • 然后运行__main__.py
  • 如果导入这个模块
    • 初始化__init__.py
    • 不运行__main__.py
  • 再看个例子例程

calendar

  • calendar 作为主模块 运行的时候
    • 出现日历

图片描述

  • 作为 被导入模块的时候
    • 没有任何输出

图片描述

观察

vi /usr/lib/python3.8/calendar.py
  • G
    • 切换到结尾
    • 观察到相关条件语句

图片描述

  • 只有主函数的时候
    • 才会调用 main()

顶级

  • 通过判断__main__=="__name__"
    • 有些代码是只有顶级的时候才执行的
    • 作为导入模块不需要执行这些代码

图片描述

  • 比如图中的sys.exit
  • 这个sys.exit是什么意思呢?

sys.exit

  • 退出当前的程序
    • 接受一个数字作为整个程序的返回值

图片描述

  • 这个sys.exit到底返回了什么?

总结

  • 我们这次了解了python文件引用的层级关系
    • 最高级的模块的__name____main__
    • 可以根据这个进行模块是否为顶级的判断
  • 自制模块文件夹
    • __main__.py就是模块主程序的入口地址
    • sys.exit函数
      • 可以直接跳出当前python执行的进程
      • 并返回一个数值
  • sys.exit到底怎么用呢?🤔
  • 我们下次再说👋

图片描述