前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python中熟悉而又陌生的 if __name__ == "__main__"

Python中熟悉而又陌生的 if __name__ == "__main__"

原创
作者头像
mr.songw
修改2021-01-22 10:52:43
7040
修改2021-01-22 10:52:43
举报
文章被收录于专栏:Python 自习室Python 自习室

在 python 文件中,我们经常会看到 if __name__ == "__main__" 。那么 if __name__ == "__main__" 是什么?它可以用来干什么呢?下面就来详细解释下。

python 解释器在读取 python 文件时,会设置一些特殊变量的值,其中有一个变量是 __name__ ,下面我们通过一些例子来认识下 __name__

python 文件作为主程序运行

新建 foo.py 文件。

代码语言:txt
复制
# foo.py

print("foo's __name__ is set to: {}".format(__name__))

执行 foo.py 文件,输出结果如下:

代码语言:txt
复制
foo's __name__ is set to: __main__

__name__ 被设置成了 __main__。当一个文件作为主程序运行时,__name__ 会被设置成 __main__

python 文件作为模块导入

新建 bar.py 文件。

代码语言:txt
复制
# bar.py

print("bar's __name__ is set to: {}".format(__name__))

foo.py 文件进行修改

代码语言:txt
复制
# foo.py
import bar

print("foo's __name__ is set to: {}".format(__name__))

执行 foo.py 文件,输出结果如下:

代码语言:txt
复制
bar's __name__ is set to: bar
foo's __name__ is set to: __main__

从结果可以看出,当 bar.py 作为一个模块被导入时,它的 __name__ 被设置成了文件的名字 bar

当直接执行 bar.py 文件时,输出结果如下:

代码语言:txt
复制
bar's __name__ is set to: __main__

和直接执行 bar.py 的结果是类似。

__name____main__ 的用法

使用 __name____main__ 最常见的方式如下:

代码语言:txt
复制
if __name__ == "__main__":
    # todo

foo.pybar.py 修改成如下:

代码语言:txt
复制
# foo.py
import bar

print("foo's __name__ is set to: {}".format(__name__))

if __name__ == "__main__":
    print("foo.py ran directly")
else:
    print('foo.py ran imported')
代码语言:txt
复制
# bar.py

print("bar's __name__ is set to: {}".format(__name__))

if __name__ == "__main__":
    print("bar.py ran directly")
else:
    print('bar.py ran imported')

执行 foo.py 文件,输出结果如下:

代码语言:txt
复制
bar's __name__ is set to: bar
bar.py ran imported
foo's __name__ is set to: __main__
foo.py ran directly

执行 bar.py 文件,输出结果如下:

代码语言:txt
复制
bar's __name__ is set to: __main__
bar.py ran directly

当执行 foo.py 时,由于 bar.py 是作为模块被导入的,所以 bar.py__name__bar。而 foo.py 是直接执行的,所以 foo.py__name____main__

文件中包含函数

foo.pybar.py 修改成如下:

代码语言:txt
复制
# foo.py
import bar

print("foo's __name__ is set to: {}".format(__name__))


def foo_func():
    print('I am foo_func')


if __name__ == "__main__":
    print("foo.py ran directly")
else:
    print('foo.py ran imported')
代码语言:txt
复制
# bar.py

print("bar's __name__ is set to: {}".format(__name__))


def bar_func():
    print("I am bar_func")


if __name__ == "__main__":
    print("bar.py ran directly")
else:
    print('bar.py ran imported')

执行 foo.py 文件,输出结果如下:

代码语言:txt
复制
bar's __name__ is set to: bar
bar.py ran imported
foo's __name__ is set to: __main__
foo.py ran directly

执行 bar.py 文件,输出结果如下:

代码语言:txt
复制
bar's __name__ is set to: __main__
bar.py ran directly

从上面两个输出结果可以看出,文件中的函数当我们不显示调用时,并不会执行。

foo.pybar.py 修改成如下,在修改后的文件中我们显示调用函数。

代码语言:txt
复制
# foo.py
import bar

print("foo's __name__ is set to: {}".format(__name__))


def foo_func1():
    print('I am foo_func1')
    

def foo_func2():
    print('I am foo_func2')


if __name__ == "__main__":
    bar.bar_func1()
    foo_func1()
    print("foo.py ran directly")
else:
    bar.bar_func2()
    foo_func2()
    print('foo.py ran imported')
代码语言:txt
复制
# bar.py

print("bar's __name__ is set to: {}".format(__name__))


def bar_func1():
    print("I am bar_func1")


def bar_func2():
    print("I am bar_func2")


if __name__ == "__main__":
    bar_func1()
    print("bar.py ran directly")
else:
    bar_func2()
    print('bar.py ran imported')

执行 foo.py 文件,输出结果如下:

代码语言:txt
复制
bar's __name__ is set to: bar
I am bar_func2
bar.py ran imported
foo's __name__ is set to: __main__
I am bar_func1
I am foo_func1
foo.py ran directly

执行 bar.py 文件,输出结果如下:

代码语言:txt
复制
bar's __name__ is set to: __main__
I am bar_func1
bar.py ran directly
总结

__name__ 的存在可以使我们更加灵活地控制 python 作为主程序执行时应该执行的代码块以及作为模块被导入执行时应该执行的代码块。

封面图:该图片由Lumina Obscura在Pixabay上发布

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • python 文件作为主程序运行
  • python 文件作为模块导入
  • __name__ 和 __main__ 的用法
  • 文件中包含函数
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档