程序入口
python,不像Java或C#等必须有一个包含main方法等主类来作为程序的入口,而是动态的逐行解释运行。也就是说从脚本的第一行开始运行,没有统一的入口。
一个python源文件除了可以被直接运行外,还可以作为模块被导入。无论是被导入还是直接运行,python都会从最顶层的代码开始运行。但是有一部分代码不被希望运行,因此可以使用if name == '__main__'
__name__
__name__
是属于 python 中的内置类属性,它天生就存在于一个 python 程序中,代表对应程序名称。同时还能反映一个包的结构。来举个例子,假设有如下一个包:
a
├── b
│ ├── c.py
│ └── __init__.py
└── __init__.py
目录中所有 py 文件的内容都为:
print __name__
我们执行 python -c “import a.b.c”,输出结果:
a
a.b
a.b.c
如果一个模块被直接运行,则其没有包结构,其 __name__ 值为 __main__。例如在上例中,我们直接运行 c.py 文件(python a/b/c.py),输出结果如下:
__main__
也就是说
如果模块是被导入,__name__
的值为该模块名字 (文件名字)
如果模块是被直接执行,__name__
的值为'__main__'
简单来说
在if name == '__main__':
下的代码只有在文件作为脚本直接执行时才会被执行,而import到其他脚本中是不会被执行的
例子:
在同一路径下创建两个文件a.py和b.py
a.py的内容如下
print('first line in a.py')
if __name__=='__main__':
print('second line in a.py')
b.py 的内容如下
import a
运行a.py 文件返回
>>> python a.py
first line in a.py
second line in a.py
运行b.py 文件
>>> python b.py
first line in a.py
可以看到,只执行了第一行,因为此时模块a的__name__=='a'
若修改a.py第三行的内容如下
if __name__=='a':
运行a.py 文件返回
>>> python a.py
first line in a.py
运行b.py 文件
>>> python b.py
first line in a.py
second line in a.py