show | version | enable_checker |
---|---|---|
step |
1.0 |
true |
- 上次研究了python类库的来源
- 系统内置
- 类库目录
- 把py程序放到python类库列表中
- py程序就成一个类库包
- 可以直接运行此程序
- 也可以作为类库导入次程序
- 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 作为主模块 运行的时候
- 出现日历
- 作为 被导入模块的时候
- 没有任何输出
vi /usr/lib/python3.8/calendar.py
- G
- 切换到结尾
- 观察到相关条件语句
- 只有主函数的时候
- 才会调用 main()
- 通过判断
__main__=="__name__"
- 有些代码是只有顶级的时候才执行的
- 作为导入模块不需要执行这些代码
- 比如图中的sys.exit
- 这个sys.exit是什么意思呢?
- 退出当前的程序
- 接受一个数字作为整个程序的返回值
- 这个sys.exit到底返回了什么?
- 我们这次了解了python文件引用的层级关系
- 最高级的模块的
__name__
是__main__
- 可以根据这个进行模块是否为顶级的判断
- 最高级的模块的
- 自制模块文件夹
__main__.py
就是模块主程序的入口地址
-
- sys.exit函数
- 可以直接跳出当前python执行的进程
- 并返回一个数值
- sys.exit函数
- sys.exit到底怎么用呢?🤔
- 我们下次再说👋