美文网首页
主程序入口__main__

主程序入口__main__

作者: 28fd90f2ac9b | 来源:发表于2019-09-29 22:33 被阅读0次

从这篇博文可以对__main__属性有一个直观的了解。

即__name__与__main__解决了.py文件自己运行与被当做模块被导入运行的区别。

下面举个例子,假设目录如下:

——main_test
    ——a
        ——__init__.py
        ——b
            ——__init__.py
            ——c.py
    ——const.py
    ——test.py

const.py文件为

# coding=utf-8
# 变量函数依然可以作为模块导入到其他模块使用

PI = 3.14

def main():
    print("execute const.py as a "+__name__+" module")

#作为主程序入口执行
if __name__ == "__main__":
    main()
#作为模块执行以下代码
else:
    print("the module name is "+__name__)

test.py文件为

if __name__ == "__main__":
    print("the module name is "+__name__)

或者为

from const import PI
print(PI)

运行test.py,即将test.py文件作为主程序入口,则结果为

the module name is __main__

或者

the module name is const
3.14

这里想要说明一点,不管是from module import item还是import module,都会执行该module的主(main)程序,除非在该主程序上加上if __name__ == "__main__",即module不再作为主程序运行。

综上,我们可以说
一个Python源码文件(.py)除了可以被直接运行外,还可以作为模块(也就是库),被其他.py文件导入。不管是直接运行还是被导入,.py文件的最顶层代码都会被运行(Python用缩进来区分代码层次),而当一个.py文件作为模块被导入时,我们可能不希望一部分代码被运行。

现在我们将test.py文件改为
import a.b.c
c.py程序为

import math
if __name__ == "__main__":
    print("This is a main Entrance")
else:
    print(__name__)

执行test.py,可得

a.b.c

这里可以说明c.py文件是当做模块导入,而且它的__name__属性充分体现了它的包的层次。另外,也说明了以上一点:只要import一个module,它就会执行该module的主程序。

如果不是执行test.py,而是执行c.py,则结果为

#这是个主程序入口
This is a main Entrance

现在再来看一下目录

PCV
    ——__init__.py
    ——tools
        ——__init__.py
        ——graphcut.py
        ——imregistration.py
        ——imtools.py
    ——localdescriptors
        ——__init__.py
        ——dsift.py
        ——harris.py
    ——geometry
        ——camera.py
        ——warp.py

在PCV目录下的__init__.py改为

if __name__ == "__main__":
    print("execute init.py as a main procedure")
else:
    print(__name__)

在Chapter 1.py里写入import PCV
则执行Chapter 1.py则会打印出PCV
这说明了__init__.py相当于是PCV(package)的主程序入口,只要import PCV(package),就会执行

if __name__ == "name of package"

下的代码。

总结

  • __name__与__main__解决了.py文件自己运行与被当做模块被导入运行的区别
  • 不管是from module import item还是import module,都会执行该module的主(main)程序,除非在该主程序上加上if __name__ == "__main__",即module不再作为主程序运行,而是作为模块执行
  • 只要from package1 import package2import package2,就会执行package1和package2目录下的__init__.py文件的主程序(main),__init__.py文件里的__name__分别就是package1和package1.package2(包名)

相关文章

  • 主程序入口__main__

    从这篇博文可以对__main__属性有一个直观的了解。 即__name__与__main__解决了.py文件自己运...

  • python初学笔记

    if__name__=='__main__':的作用是判断是否是在主程序执行,什么是主程序,就是现在 要执行的py...

  • SpringBoot学习笔记

    2、主程序类,主入口类 @SpringBootApplication: Spring Boot应用标注在某个...

  • flask 中的 if __name__ == "__main_

    0x01 if __name__ == “__main__": 在入口文件的浅层含义 如果被其他的程序加载的话,确...

  • SpringBoot 启动流程

    一、主程序入口类 1、Application.class 2、特点 该类使用了@SpringBootApplica...

  • kubernetes源码阅读——scheduler

    程序入口: NewSchedulerCommand利用默认配置创建*cobra.Command对象: 主程序的co...

  • Spring boot工程结构

    通过官方生成的Spring Boot项目,默认结构如下: 1、src/main/java 程序开发以及主程序入口...

  • 5、SpringBoot -启动流程

    配置文件能配置的属性参照 一、主程序入口类 Application.class 特点 该类使用了@SpringBo...

  • Spring Boot 项目实现热部署

    方法一:devtools Pom.xml中直接添加依赖即可: 通过项目主程序入口启动即可,改动以后重新编译就好。 ...

  • Spark学习笔记(3)SparkContext源码

    概述 Spark主程序的入口。一个SparkContext代表连接Spark集群,并且能用来创建RDD,累加器,广...

网友评论

      本文标题:主程序入口__main__

      本文链接:https://www.haomeiwen.com/subject/lpscuctx.html