使用__main__.py

为什么__init__.py是必需的,可能是任何Python专家都知道的,但是__main__.py呢? 我已经看到许多项目,无论是正在工作的还是在Github上运行的,尽管它们可以使他们的生活更轻松,但是它们并未使用此魔术文件。 我认为__main__.py是与包含多个文件的Python模块进行交互的最佳方法。


但是,让我们先正确吧:大多数人如何运行他们的Python脚本?


一旦编写了一个程序,您既要用作导入的模块,又要用作从命令行启动的工具。 您很可能知道在这种情况下通常会执行的操作:


if __name__ == '__main__': main(sys.argv) 

当您将脚本提供给解释器时,不可思议的全局变量__name__获得值__main__ 。 因此,我们了解到这不是导入,而是启动。 例如:


 python myapp.py 

这对于单个文件非常有用。


问题


但是,如果您像我一样,就不会希望将整个应用程序挤入一个文件中。 将逻辑拆分为不同的文件可简化编辑和支持。 例如:


 . ├── README.me ├── requirements.txt ├── setup.py └── src ├── __init__.py ├── client.py ├── logic.py ├── models.py └── run.py 

但是从存储库克隆项目的用户将无法理解-这些文件中的哪一个是主要文件? 真的是run.py吗? 或者也许client.py如果__name__ =='__main__'在哪里寻找熟悉的字符串? 这就是__main__.py能够证明自己的地方。


__main__.py


当项目以模块标志--m开始时,将调用__main__.py文件。 如果要将代码用作模块并从控制台启动,这将非常方便。 如果__name__ == ' __main__ ' ,可以将此文件视为放置通常放置的所有内容的地方。 让我们从上面的示例中相应地更改项目:


 . ├── README.me ├── requirements.txt ├── setup.py └── myapp ├── __init__.py ├── __main__.py ├── client.py ├── logic.py ├── models.py 

瞧! 现在,您可以简单地将项目作为常规模块启动。


 python -m myapp 

__main__.py将自动执行。 这是托管命令行界面和处理输入参数的理想场所!

Source: https://habr.com/ru/post/zh-CN456214/


All Articles