分享

python 代码中 __main__ 有什么用途?

 网摘文苑 2022-11-29 发布于北京

使用python编写自己的程序时,都会用到 __init__.py 和 __main__ 这两个代码模块,有关 __init__ 的相关内容可以阅读文章《python 代码中 __init__ 是什么用途?》,本文重点讲述有关__main__的用法。事实上,python代码中导入某个程序模块或工具包,一般都默认使用 __init__.py程序查询需要导入的程序或工具包。假定有以下两种情况:

组织在一起的许多python程序文件,作为程序模块一次性导入;

单一文件结构的多个python程序文件,在命令提示符下直接运行;

第一种情况下,就需要把组织在一起的多个程序文件,作为一个模块导入,这就要用到 __init__.py;对于第二种情况,可以使用如下代码:

def main (): pass if __name__ == '__main__': main()

这种方法类似C++或Java等其他语言中的 程序入口,也就是程序执行的起始点,但这种办法没有通用性,并不理想,那么就可以使用 __main__.py。下面看一个组织多个python程序文件的示例,文件组织结构如下图:

文章图片1

上图中的 “src” 可以作为一个模块,在其他 python 程序中加上“src”所在的路径就可以整体一次性导入。但是如果要在命令提示符下运行类似这种多个文件组织在一起的模块,就需要把__main__.py文件添加进去,文件组织结构如下图所示:

文章图片2

其中,__main__.py包括以下类似的内容:print('____请选择 _____') print('1: 求正方形的面积 \n\ 2: 求矩形的面积\n\ 3: 求圆形的面积')    ch = int(input())    if ch == 1: from src.square import square print('输入正方形的边长:') s = int(input()) print ('正方形的面接为:', square(s))    if ch == 2: from src.rectangle import rectangle print('输入矩形的长度和宽度:') l = int(input()) b = int(input()) print('矩形的面积为:', rectangle(l, b))    if ch == 3: from src.circle import circle  print('输入圆的半径') r = int(input()) print('圆形的面积为: ', circle(r))

如以上代码这样,编写 __main__.py ,就可以在命令提示符或终端输入以下命令,来运行“src” 中的 程序文件。运行时的终端输出如下图所示:

文章图片3

上图给出了在命令提示符下,运行 area-finder.py 程序包,python 就查找 __main__.py 文件并且自动运行,如果找不到__main__.py文件,就会给出报错信息,并运行main.py。以上代码只是为了理解“src” 程序包和 __main__.py 之间的关系以及 _main__.py的运行机制,可以看出,使用 __main__.py 有两个优点,既避免了 python执行程序时入口不明确的弊端,又有助于清晰地执行“src”中的程序文件,这对于较大的python项目来说很重要。

最后顺便说一下,python 程序中 if __name__ == “__main__”: 的用途。

python 在执行源代码文件之前,解释器先读入源代码文件,并定义几个专用的变量或全局变量。如果python解释器把该源代码作为主程序,那么就会设定 __name__ 变量的值为 “__main__”;如果要运行的程序需要从其他程序模块导入,那么 __name__ 变量的值就设置为目标程序模块的名称,该模块名称对于__name__这个全局变量来说是有效的,这样的程序模块是一个代码文件,包括定义和说明,文件扩展名也是.py。看看下面这段示例代码,名称为script.py :

# Python 程序直接执行 __main__print ('总是执行__main__') if __name__ == '__main__': print ('直接调用时执行__main__')else: print ('导入时执行__main__')

以上代码文件中,未缩进的语句都会被执行,但只进行函数和类的定义,并不运行代码,其中 __name__变量的值是 __main__;对于缩进的语句,只运行入口模块,可以看出哪一句是直接执行的,哪一句是导入后再执行的,如果是导入执行的,那__name_变量的值就是要执行的程序模块的名称。看看下面的示例代码:# Python 程序直接运行函数def my_function():    print ('I am inside function') # 测试函数调用my_function()

如果使用的模块需要导入,代码可以写成如下:

#先导入要调用的函数,再运行if __name__ == '__main__': my_function() import myscript myscript.my_function()

通过前面的讲述和示例代码,可以简单地了解 if __name__ == '__main__': 的用途。一般来讲,每个python程序模块都有 __name__ 变量及其设定值,如果设定值为 __main__,就意味着该模块可以单独执行;如果该程序模块在另一个程序模块内,那__name__ 的值就要设定为目标程序模块的名称;if __name__ == 'main': 只能用于直接执行代码块的某一部分代码,而不是导入相关代码来执行。

(本文完)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多