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

写了2年python,知道 if __name__ == '__main__' 什么意思吗?的更多相关文章

  1. python 中if __name__ = '__main__' 的作用

    python 中if __name__ = '__main__' 的作用 前言 首先我们要知道在python里面万物皆对象,模块也是对象,并且所有的模块都有一个内置属性 __name__. 一个模块的 ...

  2. python中if __name__ == '__main__'

    python 中__name__ = '__main__' 的作用,到底干嘛的? 有句话经典的概括了这段代码的意义: “Make a script both importable and execut ...

  3. FAQ: Python中if __name__ == '__main__':作用

    #hello.pydef sayHello(): str="hello" print(str); if __name__ == "__main__": prin ...

  4. 【Python中if __name__ == '__main__': 的解析】

    在很多Python代码中,在代码的最下方会看到  if __name__ == '__main__':,这段代码到底有什么用呢? 在理解这个语句的作用前,需要知道的是,一般的Python文件后缀为.p ...

  5. Python中if __name__=="__main__" 语句在调用多进程Process过程中的作用分析

    2018年2月27日 于创B515 引言 最近准备学习一下如何使用Python中的多进程.在翻看相关书籍.网上资料时发现所有代码都含有if __name__=="__main__" ...

  6. python对 if __name__=='__main__'的理解

    对于学过其他编程语言的人来说都知道程序都是从main函数开始执行的,而对于python来说他并没有主函数,他不像其他语言需要需要转化为二进制文件 然后才能执行,他时通过翻译器从第一行开始逐行执行,所以 ...

  7. Python中if __name__ == '__main__',__init__和self 的解析

    1.2.1 一个.py文件被其他.py文件引用 假设我们有一个const.py文件,内容如下: 现在,我们写一个用于计算圆面积的area.py文件,area.py文件需要用到const.py文件中的P ...

  8. python小知识——__name__ = '__main__' 的作用

    很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = ...

  9. Python:if __name__ == '__main__'

    简介: __name__是当前模块名,当模块被直接运行时模块名为_main_,也就是当前的模块,当模块被导入时,模块名就不是__main__,即代码将不会执行. 关于代码if __name__ == ...

  10. Python中“if __name__=='__main__':”理解与总结

    1 引言 在Python当中,如果代码写得规范一些,通常会写上一句“if __name__==’__main__:”作为程序的入口,但似乎没有这么一句代码,程序也能正常运行.这句代码多余吗?原理又在哪 ...

随机推荐

  1. OO课程第三次总结QWQ

    调研,然后总结介绍规格化设计的大致发展历史和为什么得到了人们的重视 emmm为这个问题翻遍百度谷歌知乎也没有得到答案,那我就把自己认为最重要的两点简要说明一下吧,欢迎大家补充~ 1.便于完成代码的重用 ...

  2. (转)Java Web(一) Servlet详解!!

    https://www.cnblogs.com/whgk/p/6399262.html 这篇文章到上一篇,距离的有点遥远呀,隔了大概有两个月把,中间在家过了个年,哈哈~ 现在重新开始拾起,最近在看一本 ...

  3. 安装composer Failed to decode zlib stream 问题解决方法

    https://getcomposer.org/download/ 页面下载最新版本 composer.phar 放到php.exe 页面下.创建一个.bat文件,存入下面内容 @ECHO OFF p ...

  4. delphi fastreport 动态加载图片

    (frxReport1.FindObject('picture1') as TfrxPictureView).Picture.LoadFromFile('d:\c.jpg'); frxReport1. ...

  5. Windows 自动化补丁管理

    Windows 自动化补丁管理 Desktop Central,这一倍受欢迎的补丁管理软件旨在修补可能导致安全薄弱.破坏关键系统数据或导致系统不可用的漏洞.管理此类软件漏洞对网络管理员来说简直是噩梦. ...

  6. [转]etcd 启用 https

    1, 生成 TLS 秘钥对 2,拷贝密钥对到所有节点 3,配置 etcd 使用证书 4,测试 etcd 是否正常 5,配置 kube-apiserver 使用 CA 连接 etcd 6,测试 kube ...

  7. widnow 下配置php开发环境

    首先下载Php 和 Nginx php 下载链接 nginx 下载链接 下载完成之后 解压到对应目录 (我这里存放在e盘) 解压之后 进入nginx目录 直接双击nginx.exe(一闪而过); 之后 ...

  8. js实现(可实现局部打印)

    1.js实现(可实现局部打印) <input id="btnPrint" type="button" value="打印" oncli ...

  9. C语言函数指针与 c#委托和事件对比

    C语言: 函数指针可以节省部分代码量,写类似具有多态的函数,比如要比较最大值,如果不用函数指针就只能写比较某一类型比如int类型的max函数,这个max无法比较string的大小.函数指针的意义就不多 ...

  10. 关于Idea里设置Terminal为Git/bin/bash.exe中文乱码的问题的终极解决方案

    1.这里如果设置为Git/git-bash.exe确实不会乱码,但是每次点Idea里的Terminal都会弹出一个单独的terminal窗口而非在idea子窗口里出现: 2.因此需要设置为Git/bi ...