网站首页 > 技术文章 正文
使用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程序文件的示例,文件组织结构如下图:
上图中的 “src” 可以作为一个模块,在其他 python 程序中加上“src”所在的路径就可以整体一次性导入。但是如果要在命令提示符下运行类似这种多个文件组织在一起的模块,就需要把__main__.py文件添加进去,文件组织结构如下图所示:
其中,__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” 中的 程序文件。运行时的终端输出如下图所示:
上图给出了在命令提示符下,运行 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": 只能用于直接执行代码块的某一部分代码,而不是导入相关代码来执行。
(本文完)
猜你喜欢
- 2024-11-20 看完文章让你读懂if __name__=='__main__'的含义,面试不用愁
- 2024-11-20 一个实例理解Python中的if __name__ ==“__main__”
- 2024-11-20 Python if __name__ 的作用介绍
- 2024-11-20 Python基础--Python中的main、__name__ == "__main__"
- 2024-11-20 Python中的 if __name__ == "__main__"作用?
- 2024-11-20 了解 Python 中 if __name__ == "__main__" 的作用
- 2024-11-20 算法金 | Python 中有没有所谓的 main 函数?为什么?
- 2024-11-20 Python 中 if __name__ == '__main__' 的解释
- 2024-11-20 在Python中定义Main函数
- 2024-11-20 你必须要知道的Python中的main函数
- 最近发表
-
- 如何在 Linux 上安装 Java_怎么在linux中安装jdk
- Linux中tar命令打包路径相关问题_linux怎么用tar打包一个目录
- 常用linux系统常用扫描命令汇总_常用linux系统常用扫描命令汇总表
- VM下linux虚拟机新建过程(有图)_linux虚拟机创建新用户命令
- 系统小技巧:迁移通过Wubi方式安装的Ubuntu系统
- 文件系统(八):Linux JFFS2文件系统工作原理、优势与局限
- 如何利用ftrace精确跟踪特定进程调度信息
- prometheus网络监控之fping-exporter
- hyper linux的实操步骤,hyper-v批量管理工具的使用指南
- 2021年,运维工程师笔试真题(二)(附带答案)
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)