初识 __name__
假设我们有一个 Python 脚本 a.py
# a.py
print(__name__)
# python a.py
# __main__
当我们用python a.py命令运行a.py时,a.py内的__name__变量会自动被设置为__main__。
# b.py
print(__name__)
# python b.py
# __main__
同样,如果使用 python b.py 命令运行 b.py ,b.py 的 __name__ 变量将自动变成 __main__ 。
如果我们直接运行
.py,文件中的__name__会自动变成'__main__'。
有 2 个 .py 文件
假设有 2 个文件 a.py 和 b.py。
# b.py
def hello_b():
print('hello_b __name__:', __name__)
# a.py
from b import hello_b
hello_b()
# python a.py
# hello_b __name__: b
在 a.py 中,从 b.py 导入一个函数。在 b.py 中的这个函数中,打印 __name__。然后使用 python a.py直接运行a.py(注意,b.py不会直接运行)
由于直接运行了 a.py,所以 a.py 中只有 __name__ 是 '_main__'。从 b.py 中导入的 __name__ 将是 'b' 而不是 '__main__'。
有 3 个 .py 文件
代码语言:javascript复制# b.py
def hello_b():
print('from b.py:', __name__)
# c.py
def hello_c():
print('from c.py:', __name__)
# a.py
from b import hello_b
from c import hello_c
hello_b() # from b.py: b
hello_c() # from c.py: c
在此示例中,a.py 分别从 b.py 和 c.py 中导入了一个函数,这两个函数都打印了 __name__。由于我们直接运行 a.py,因此 b.py 中的 __name__ 是 'b',而 c.py 中的 __name__ 是 'c'。
这解释了为什么我们会在打印语句中看到 from b.py: b 和 from c.py: c。
意外运行我们不想运行的代码
代码语言:javascript复制# b.py
def hello_b():
print('from b.py:', __name__)
print('@公众号:数据STUDIO')
# c.py
def hello_c():
print('from c.py:', __name__)
# a.py
from b import hello_b
from c import hello_c
hello_b()
hello_c()
在这里,我们在 b.py 中添加了额外的打印语句,并直接使用 python a.py 运行 a.py。输出结果如下
@公众号:数据STUDIO
from b.py: b
from c.py: c
在这里,请注意 @公众号:数据STUDIO 也被打印出来了。这是因为我们从 b.py 中导入了一个函数。
添加 if __name__ == '__main__'
代码语言:javascript复制# b.py
def hello_b():
print('from b.py:', __name__)
if __name__ == '__main__':
# 只有直接运行 b.py 时才能运行
# 例如,使用 "python b.py"
print('@公众号:数据STUDIO')
# c.py
def hello_c():
print('from c.py:', __name__)
# a.py
from b import hello_b
from c import hello_c
hello_b()
hello_c()
在这里,如果我们运行 python a.py,会得到这样的输出:
from b.py: b
from c.py: c
这是因为我们在文件 b.py 中添加了 if __name__ == '__main__' 的语句。只有在直接运行 Python 脚本时,才会执行此处的代码块。
在这个例子中,print('@公众号:数据STUDIO') 只有在我们直接运行 b.py 文件时才会被执行,也就是说,我们使用命令 python b.py。
if __name__ == '__main__'用于防止意外运行我们不想运行的代码。


