Python中if __name__ == "__main__": 的作用

Python中if __name__ == "__main__": 的作用

在很多python脚本中在最后的部分会执行一个判断语句if __name__ == "__main__:",之后还可能会有一些执行语句。那添加这个判断的目的何在?

在python编译器读取源文件的时候会执行它找到的所有代码,而在执行之前会根据当前运行的模块是否为主程序而定义变量__name__的值为__main__还是模块名。因此,该判断语句为真的时候,说明当前运行的脚本为主程序,而非主程序所引用的一个模块。这在当你想要运行一些只有在将模块当做程序运行时而非当做模块引用时才执行的命令,只要将它们放到if __name__ == "__main__:"判断语句之后就可以了。

具体举个栗子方便理解:

# file one.py
def func():
    print("func() in one.py")

print("top-level in one.py")

if __name__ == "__main__":
    print("one.py is being run directly")
else:
    print("one.py is being imported into another module")
# file two.py
import one        # start executing one.py

print("top-level in two.py")
one.func()

if __name__ == "__main__":
    print("two.py is being run directly")
else:
    print("two.py is being imported into another module")

当运行python one.py,输出:

top-level in one.py
one.py is being run directly

当运行python two.py,输出:

top-level in one.py
one.py is being imported into another module
top-level in one.py
func() in one.py
two.py is being run directly  

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

如何防止单例模式被JAVA反射攻击

单例模式相信大家都知道,用过的人不在少数。之前写过一篇博文《singleton模式四种线程安全的实现》(参见:http://blog.csdn.NET/u013...

1381
来自专栏黑泽君的专栏

java基础学习_多线程01_多线程_day23总结

742
来自专栏小詹同学

Python 中的 sys.argv 是个什么鬼?

最近在 github 上 git 别人的代码下来学习 ,其中有一个 face-detection 相关的代码 ,就涉及了 sys.argv ,并且运行后是这个样...

1183
来自专栏上善若水

001golang中的字符串编码问题无标题文章

HTMLEscape 函数将json编码的src中的<、>、&、U+2028 和U+2029字符替换为\u003c、\u003e、\u0026、\u2028、\...

3202
来自专栏marsggbo

python编码问题

python编码问题 解决方法 python 编码 sys 在用python的时候经常会遇到编码乱码的问题,这时就需要用到sys模块。具体代码如下: impor...

2325
来自专栏蓝天

Google的dense_hash注意点

使用Google的dense_hash_map,在插入数据之前,需要先调用set_empty_key()设置一个空Key,Key的值可以为任意符合类型的。但请...

601
来自专栏Echo is learning

字符、字符集、编码,以及它们python中会遇到的一些问题(下)

1555
来自专栏别先生

Struts2(接受表单参数)请求数据自动封装和数据类型转换

Struts2请求数据自动封装:   (1)实现原理:参数拦截器   (2)方式1:jsp表单数据填充到action中的属性;        普通的成员变量,...

2117
来自专栏java一日一条

Java代码编译和执行的整个过程

JVM的类加载是通过ClassLoader及其子类来完成的,类的层次关系和加载顺序可以由下图来描述:

1092
来自专栏desperate633

Java线程通信(Thread Signaling)利用共享对象实现通信忙等(busy waiting)wait(), notify() and notifyAll()信号丢失(Missed Sign

线程通信的目的就是让线程间具有互相发送信号通信的能力。 而且,线程通信可以实现,一个线程可以等待来自其他线程的信号。举个例子,一个线程B可能正在等待来自线程A...

922

扫码关注云+社区

领取腾讯云代金券