Python中if name == ‘main‘的妙用

参考:Python中的 if name == ‘main’ 是干嘛的?

先运行下面代码:

print(__name__)

if __name__ == "__main__":
    print(__name__)
    print("hello world")

print(__name__)

Python中if name == ‘main‘的妙用_第1张图片
当py文件作为主程序直接运行时,__name__无论在哪都是__main__

if __name__ == "__main__"有什么用呢?

一个py文件也是一个模块,可以像库一样被import导入到另一个py文件中,而被导入的同时, 文件中的代码也会被执行

下面运行的是test.py文件

Python中if name == ‘main‘的妙用_第2张图片

在被导入的文件中输出__name__变量

Python中if name == ‘main‘的妙用_第3张图片
发现__name__不再是__main__,而是成了文件名

  • 如果__name__所在文件是直接被运行,不管是通过IDE还是命令行,它的值都是__main__
  • 如果__name__所在文件是被别的文件调用执行,比如作为模块导入,它的值就是所在文件的文件名

所以if __name__ == "__main__"不用来指定程序的入口,而是判断当前文件是不是直接运行的

作用

对于一些既需要直接运行,又作为模块被其他代码复用的文件,就可以通过if __name__ == "__main__"来控制在不同情况下执行不同的代码。很多模块会把调用的示例或者测试的代码放在这个条件判断里,既方便又不影响使用

不过程序被调用执行的情况并不只有import导入这一种,比如采用进程池创建多进程的代码

import multiprocessing


def task(n):
    print('Processing', n)
    return n * n


with multiprocessing.Pool() as pool:
    tasks = range(5)
    results = pool.map(task, tasks)

print(results)

如果运行会一直报错。因为 Windows 系统不支持 Unix/Linux 的fork()机制,Python 在 Windows 上创建子进程时需要重新导入主模块。如果主模块代码没有被if __name__ == "__main__":保护,就会导致子进程重复执行创建进程池的代码,形成无限递归

加上if __name__ == "__main__"让子进程不要执行创建进程的代码

import multiprocessing


def task(n):
    print('Processing', n)
    return n * n


if __name__ == "__main__":
    with multiprocessing.Pool() as pool:
        tasks = range(5)
        results = pool.map(task, tasks)
    print(results)

Python中if name == ‘main‘的妙用_第4张图片

总结

__name__

  • 在直接运行时值为__main__
  • 在被导入或者创建子进程时值为所在文件名

可以通过if __name__ == "__main__"来区分不同的执行方式,增加了代码的灵活性和可维护性

你可能感兴趣的:(Python,python)