Python 中 if _ _name_ _ == '_ _main_ _' 到底是什么意思?

2024-06-04 18:20:41 浏览数 (2)

希望这篇文章清楚易懂。

初识 __name__

假设我们有一个 Python 脚本 a.py

代码语言:javascript复制
# a.py

print(__name__)    

# python a.py
# __main__

当我们用python a.py命令运行a.py时,a.py内的__name__变量会自动被设置为__main__

代码语言:javascript复制
# b.py

print(__name__)

# python b.py
# __main__

同样,如果使用 python b.py 命令运行 b.pyb.py__name__ 变量将自动变成 __main__

如果我们直接运行 .py,文件中的 __name__ 会自动变成'__main__'

有 2 个 .py 文件

假设有 2 个文件 a.pyb.py

代码语言:javascript复制
# 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.pyc.py 中导入了一个函数,这两个函数都打印了 __name__。由于我们直接运行 a.py,因此 b.py 中的 __name__'b',而 c.py 中的 __name__'c'

这解释了为什么我们会在打印语句中看到 from b.py: bfrom 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。输出结果如下

代码语言:javascript复制
@公众号:数据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,会得到这样的输出:

代码语言:javascript复制
from b.py: b
from c.py: c

这是因为我们在文件 b.py 中添加了 if __name__ == '__main__' 的语句。只有在直接运行 Python 脚本时,才会执行此处的代码块。

在这个例子中,print('@公众号:数据STUDIO') 只有在我们直接运行 b.py 文件时才会被执行,也就是说,我们使用命令 python b.py

if __name__ == '__main__' 用于防止意外运行我们不想运行的代码。

0 人点赞