乐趣区

写了2年python,知道 if __name__ == ‘__main__’ 什么意思吗?

相信刚接触 Python 的你一定有过如此经历,把所有的代码都写在 if __name__ == ‘__main__’ 下,因为有人告诉你,这样比较符合 Pythonista 的代码风格。
殊不知这段代码的意义并不是一定要存在于执行代码中,而是在日常工作中,为了调试某个模块的正确性,我们往往会在当前模块下直接写一个 if __name__ == ‘__main__’,测试逻辑写在下面,这样,在其他模块调用这个模块里的方法也好,类也好的时候,就不会去调用 if __name__ == ‘__main__’ 下面的逻辑了。
原因很简单,因为 if __name__ == ‘__main__’ 中的 __name__ 代表的就是当前执行的模块名。
python 一切皆对象,所以 python 的模块也是对象,他有一个 built-in module,叫 __name__,存储着模块是如何被执行的,如果是执行当前模块,那么就显示 __main__,如果是被引用进来的,就显示被引用的路径。

好了,解释完了这个奇妙的 __name__ 后,我们就来看下如何在其他模块中调用这个 __main__ 呢?
首先来看下我们待被执行的代码:
import sys

def main(args):
print(args)

if __name__ == ‘__main__’:
print(“ 执行如下代码 __name__ == ‘__main__'”)
# 参数随便指定即可
main(sys.argv[1:])
我们来执行看下结果:

接下来我们来使用 subprocess 模块来从其他模块中调用 __main__
import subprocess

process = subprocess.run(
[‘python’, ‘app.py’, ‘miracle’],
stdin=subprocess.PIPE, stdout=subprocess.PIPE
)
print(process.stdout)
调用结果

使用 subprocess 的「优点」就是因为其实是通过创建一个子进程来执行的程序,所以不受子程序的影响,不会出现程序抛异常或主动退出进程导致主程序也退出的尴尬问题。「缺点」就是需要创建子进程,相对来说资源消耗比较大。
subprocess 详细的用法详见这里不多做介绍,有兴趣的可以自行翻阅 manual。
接下来我们使用 runpy 模块来调用看看
import runpy

runpy.run_path(‘app.py’, run_name=’__main__’)
调用结果

使用 runpy 的优点就是不需要创建子进程,相对来说资源消耗比较小。缺点就是主程序会受待执行程序的影响,会出现待执行程序中抛异常或主动退出会导致主程序也退出的尴尬问题。
runpy 详细的用法详见这里不多做介绍,有兴趣的可以自行翻阅 manual。
这两种方法就是比较常用的在一个模块中执行另一个模块的 if __name__ == ‘__main__’ 的方法。总结来说就是,一个是在子进程中执行代码,一个是在当前进程中执行代码。
好啦,今天的内容就到这了,感兴趣的你,可以试试能不能走出来~
注公众号「Python 专栏」,后台回复「mainmodule」,获取本文全套源码!

退出移动版