0. 标题
Python专家编程系列: 11.为什么在python使用__name__ == ‘main’
id: 104
作者: quantgalaxy@outlook.com
欢迎交流
1. 单个 python 文件中的 __name__ 是什么?
我们先看一个简单的python程序脚本a.py:
# a.pyprint(__name__) # python a.py
# __main__
如果在命令行中运行 a.py,比如 python a.py 的方式,__name__ 变量默认就打印的是 “main”。
再看一个例子:
# b.pyprint(__name__)# python b.py
# __main__
If we run a.py directly, the __name__ inside that file will automatically become '__main__'
2. 多个 python 文件引用中的 __name__ 是什么?
我们来看下,如果有两个文件,a.py 和 b.py:
# b.py
def hello_b():print('hello_b __name__:', __name__)
a.py 来使用 b.py 的函数:
# a.py
from b import hello_bhello_b()# python a.py
# hello_b __name__: b
如果执行 a.py 脚本,会看到,输出的不再是"main",而是"b"。
这是因为,b.py 不是直接运行的,这时候 b.py 中的 __name__ 就是 b.py 脚本本身的名字了。这是因为 b.py 是被导入的,不是被直接执行的。
可以看下面的例子:
# b.py
def hello_b():print('hello_b __name__:', __name__)
# c.pydef hello_c():print('from c.py:', __name__)
# a.pyfrom b import hello_b
from c import hello_chello_b() # from b.py: b
hello_c() # from c.py: c
可以看到,被导入的脚本内部的 __name__ 都是文件本身或者说模块本身的名字。
3. __name__ 的使用
先看一下下面的例子:
# b.pydef hello_b():print('from b.py:', __name__)print('hahaha')
# a.pyfrom b import hello_bhello_b()
执行 python a.py,输出是:
hahaha
from b.py: b
可以看到,“hahaha” 也被输出了,这是因为在import b的时候,所有b的脚本都会被执行。
如果想一些语句只在脚本被直接访问的时候执行,而不是被import的时候执行,这时候,就需要用到 __name__ 来识别:
上面的 b.py 可以改为:
# b.py 改进版def hello_b():print('from b.py:', __name__)if __name__ == '__main__':# this only runs if we run b.py directly# eg. by using 'python b.py'print('hahaha')
这时候执行 python a.py,输出如下:
from b.py: b
这是因为我们利用了 if __name__ == ‘main’ 这个语句,来识别 b.py 脚本到底是被import的,还是被python执行器直接执行的。
这就是我们在一个程序的入口程序脚本中,经常会看到 if __name__ == ‘main’ 这个语句的原因。
非入口脚本,所有的语句,都应该封装在类或者函数中,这样才能保证语句都是被明确调用执行的,而不会被import的时候就被执行。
4. 作者信息
作者: quantgalaxy@outlook.com
欢迎交流