资讯专栏INFORMATION COLUMN

写了2年python,知道 if __name__ == '__main__'

wangbinke / 1153人阅读

摘要:原因很简单,因为中的代表的就是当前执行的模块名。缺点就是主程序会受待执行程序的影响,会出现待执行程序中抛异常或主动退出会导致主程序也退出的尴尬问题。总结来说就是,一个是在子进程中执行代码,一个是在当前进程中执行代码。

相信刚接触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」,获取本文全套源码!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43419.html

相关文章

  • python3 logging 'ascii' codec can't

    摘要:环境问题发现最近刚从换到下搬砖,发现在跑的好好的代码,在下终端老是报错还是编码错误注册失败坦白说,看到这个错误好无奈。既然能在跑,换到就出错,那多半是环境问题了,然后我就开始了我的调试追踪之旅了跟踪调试先前调试都是一晃而过,只看结果。 环境:mac 10.12 python3 django 1.10 问题发现 最近刚从arch 换到 mac下搬砖, 发现在arch跑的好好的代码,...

    txgcwm 评论0 收藏0
  • [Archer's Python Lab]jython+ddmlib 安卓屏幕截图并在we

    摘要:代码获取设备列表信息获取设备列表信息超时获取所有已连接设备根据获取单个当前设备不存在序号为的设备请检查连接获取当前屏幕图像的字节数据保存图像字节数据保存当前屏幕对象将当前屏幕图像数据保存为图片横屏尺寸处理发生异常为空 部分代码思路来源于互联网 需求 之前一直在寻找一种完美的移动设备屏幕流回传方案,这种尝试一旦成功即可运用于多种平台,比如云端测试Portal中对机器设备屏幕的...

    Hujiawei 评论0 收藏0
  • [python] 初探'函数式编程'

    摘要:前言继续向下看廖大教程,看到了函数式编程这一节,当时是觉得没啥用直接跳过了,这次准备要仔细看一遍了,并记录下一些心得。 前言 继续向下看廖大教程,看到了函数式编程这一节,当时是觉得没啥用直接跳过了,这次准备要仔细看一遍了,并记录下一些心得。 函数式编程 上学期有上一门叫 人工智能 的课,老师强行要我们学了一个叫做 prolog 的语言,哇那感觉确实难受,思维方式完全和之前学过的不一样,...

    xcc3641 评论0 收藏0
  • 欧拉函数(Euler' totient function )

    摘要:传送门这个就是主角欧拉函数。在数论中,对正整数,欧拉函数是小于或等于的正整数中与互质的数的数目。欧拉函数实际上是模的同余类所构成的乘法群即环的所有单位元组成的乘法群的阶。 欧拉函数(Euler totient function ) Author: Jasper Yang School: Bupt 前言 gamma函数的求导会出现所谓的欧拉函数(phi),在一篇论文中我需要对好几个欧...

    lewinlee 评论0 收藏0

发表评论

0条评论

wangbinke

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<