每个 python 模块(python 文件,如下的 test.py)都包含了内置的变量 __name__
, 用来表示当前模块的名字,如果是直接运行该模块,则当前模块的__name__
为__main__
,如果该模块是被导入的 (import),则__name__
为当前的文件名(没有.py)
例子如下:
- test.py
print("test.py: ", __name__)
输出:
test.py: __main__
- test1.py
import test
print("test1.py: ", __name__)
输出:
test.py: test
test1.py: __main__
-----------------------------------------------------------------------------------------------------
对于很多编程语言来说,程序都必须要有一个入口,比如 C,C++,以及完全面向对象的编程语言 Java,C# 等。如果你接触过这些语言,对于程序入口这个概念应该很好理解,C 和 C++ 都需要有一个 main 函数来作为程序的入口,也就是程序的运行会从 main 函数开始。同样,Java 和 C# 必须要有一个包含 Main 方法的主类来作为程序入口。
而 Python 则有不同,它属于脚本语言,不像编译型语言那样先将程序编译成二进制再运行,而是动态的逐行解释运行。也就是从脚本第一行开始运行,没有统一的入口。
一个 Python 源码文件除了可以被直接运行外,还可以作为模块(也就是库)被导入。不管是导入还是直接运行,最顶层的代码都会被运行(Python 用缩进来区分代码层次)。而实际上在导入的时候,有一部分代码我们是不希望被运行的。
比如:
- test.py
Pi = 3.14
def main():
print("Pi: ", Pi)
main()
运行 test.py: python test.py
输出:
Pi: 3.14
- test1.py
from test import Pi
def area(r):
return Pi*(r**2)
def main():
print("Area: ", area(2))
main()
运行test1.py: test1.py
Pi: 3.14
Area: 12.56
可以看到,我们在 import test import Pi
的时候,把 test.py 也执行了一遍,这样就输出了 Pi,而我们这里不想输出 Pi,运行 test1.py,因此可以这么改:
- test.py
Pi = 3.14
def main():
print("Pi: ", Pi)
print(__name__)
if __name__ == '__main__':
main()
输出:
main
Pi: 3.14
-test1.py
from test import Pi
def area(r):
return Pi*(r**2)
def main():
print("Area: ", area(2))
print(__name__)
if __name__ == '__main__':
main()
输出:
test
main
Area: 12.56
这样就只输出test1.py里面的内容,因为在 test1.py import test.py后,运行python test1.py
时,__name__
在test1.py中为__main__
,在test.py中__name__
为 test.py 的模块名 (test
),因此 test.py 中判断条件不符合
网友评论