__main__.py 在Python中的使用
我们中的许多人都曾在Python中创建自己的自定义模块,并且非常熟悉候选“ __init__.py
”。如果您不知道,那么在深入探讨相关主题之前,让我们先简要介绍一下“__init__.py”。实际上,默认情况下,当我们尝试将模块导入Python时, Python会访问 __init__.py 以查找必要的导入。
现在有两种情况。
- 组织良好的Python文件可以作为模块导入
- 可以直接通过命令行运行的Python文件(单文件结构)
在第一种情况下,当我们尝试将其作为模块导入时, __init__.py
开始发挥作用。对于第二种情况,我们使用一些 hackish 语法,例如
def main ():
pass
if __name__ == '__main__':
main()
此语法可能与其他语言(如Java和 C++)中的 main 开头有关。但是这种语法不适用于第三种情况。那么如果我们想直接从命令行运行这些文件怎么办?
这就是 __main__.py 来拯救的地方。
举个例子,我们会求矩形、正方形和圆形的面积。为了便于理解,我们将这三个操作划分为三个独立的 .py 文件,并将其存储在一个名为 src 的模块中。
文件树将如下所示
+---src
| | circle.py
| | rectangle.py
| | square.py
| | __init__.py
| |
现在 src 如果添加到路径中,可以作为任何其他Python程序的模块导入。但是如果我们想从命令行运行它怎么办。为此,我们将 src 文件夹存储在名为area_finder的文件夹下,并在其下添加一个名为__main__.py的文件。树看起来像
area_finder
| readme.md
| __main__.py
|
+---src
| | circle.py
| | rectangle.py
| | square.py
| | __init__.py
| |
__main__.py的内容
print("____-menu_____")
print("1: to find area of square \n\
2: to find area of rectangle\n\
3: to find area of circle")
ch = int(input())
if ch == 1:
from src.square import square
print("enter side")
s = int(input())
print ("the area is ", square(s))
if ch == 2:
from src.rectangle import rectangle
print("enter length and breadth")
l = int(input())
b = int(input())
print("the area is ", rectangle(l, b))
if ch == 3:
from src.circle import circle
print("enter radius")
r = int(input())
print("the area is ", circle(r))
现在,当我们像这样从终端/命令提示符运行它们时
python area_finder
输出将是 -
那么当我们执行命令时会发生什么。 Python查找名为__main__.py的文件以自动开始执行。如果它没有找到它会抛出一个错误,否则它将执行 main.py 并且从代码中,你可以很好地理解它会从 src 导入模块来找到该区域。
所以现在我们已经了解了 __main__.py 是如何工作的。现在,让我们来看看它最大的优势:
- 它消除了最终用户之间关于程序入口点的歧义,因为Python会自动执行它
- 它有助于干净地执行代码