概述
相信刚接触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__' 的方法。
总结来说就是,一个是在子进程中执行代码,一个是在当前进程中执行代码。
好啦,今天的内容就到这了,感兴趣的你,可以试试能不能走出来~
今天的代码都已上传至我的github:
https://github.com/MiracleYoung/exercises/exec_othermodule_main
最后,放一个我的星球二维码,在我的星球里,你能够获得什么?
1. 「每周精选」
会总结一周来的得与失,以及热点、技术,做一个速递。
包括我付费参加的一些星球那学到的东西。
2. 「大航海计划」
由船长发起,分为多个阶段,或招募或淘汰若干名船员,每周都会在星球做一次项目汇报。目标是让球友能够在星球里找到志同道合的小伙伴一起驶向新世界。
目前这个计划首发由我担任船长,第一期船员招募已结束,第二期即将开启。
目的是通过游戏帮助python零基础船员从零开始学习python,并能够自己制作客户端,在游戏中体验编程的乐趣。而会python的也不会因为简单而弃船,因为游戏是公平的,你不可能出于绝对优势,总有人能够编写出一套强大的客户端来战胜你。
一天0.25元能买什么,而加入一个积极向上、努力的圈子永远都不晚。
推荐阅读:
一周速递 | 总结既往,不是为了抱歉,是为了微笑明天
万字谏言 | 零基础转行Python,到底路在何方?
最后
以上就是疯狂猎豹为你收集整理的Python | 别人家的代码 if __name__ == '__main__' 到底什么意思?的全部内容,希望文章能够帮你解决Python | 别人家的代码 if __name__ == '__main__' 到底什么意思?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复