社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

在Python中定义Main函数

Python程序员 • 7 年前 • 515 次点击  

目录

  • Python中的基本main()函数

  • Python中的执行模式

    • 基于命令行执行

    • 导入模块或解释器

  • Main函数的最佳实践

    • 将大部分代码放入函数或类中

    • 使用__name__控制代码的执行

    • 创建名为main()的函数来包含要运行的代码

    • 在main()中调用其他函数

    • 实践总结

  • 结论


许多编程语言都有一个特殊的函数,当操作系统开始运行程序时会自动执行该函数。这个函数通常被命名为main(),并且依据语言标准具有特定的返回类型和参数。另一方面,Python解释器从文件顶部开始执行脚本,并且没有自动执行的特殊函数。


尽管如此,为程序的执行定义一个起始点有助于理解程序是如何运行的。Python程序员提出了几种方式对此进行实现。


本文结束时,您将了解以下内容:

  • 什么是特殊的__name__变量以及Python中如何定义它

  • 为什么要在Python中使用main()函数

  • 在Python中定义main()函数有哪些约定

  • main()函数中应该包含哪些代码的最佳实践


Python中的基本main()函数


一些Python脚本中,包含一个函数定义和一个条件语句,如下所示:

此代码中,包含一个main()函数,在程序执行时打印Hello World!。此外,还包含一个条件(或if)语句,用于检查__name__的值并将其与字符串"__main__"进行比较。当if语句为True时,Python解释器将执行main()函数。更多关于Python条件语句的信息可以由此获得


这种代码模式在Python文件中非常常见,它将作为脚本执行并导入另一个模块。为了帮助理解这段代码的执行方式,首先需要了解Python解释器如何根据代码的执行方式设置__name__。

Python中的执行模式


Python解释器执行代码有两种方式:

  1. 通过命令行方式执行Python脚本。

  2. 将代码从一个文件导入另一个文件或者解释器。


更多内容可参考如何运行Python脚本。无论采用哪种方式,Python都会定义一个名为__name__的特殊变量,该变量包含一个字符串,其值取决于代码的使用方式。


本文将如下示例文件保存为execution_methods.py,以探索代码如何根据上下文改变行为:

在此文件中,定义了三个对print()函数的调用。前两个打印一些介绍性短语。第三个print()会先打印短语The value __name__ is,之后将使用Python内置的repr()函数打印出__name__变量。


在Python中,repr()函数将对象转化为供解释器读取的形式。上述示例通过使用repr()函数来强调__name__的值为字符串。更多关于repr()的内容可参考Python文档


在本文中,您将随处可见文件(file),模块(module)和脚本(script)这三个字眼。实际上,三者之间并无太大的差别。不过,在强调代码目的时,还是存在细微的差异:

  1. 文件:通常,Python文件是包含代码的任何文件。大多数Python文件的扩展名为.py。

  2. 脚本:Python脚本是基于命令行执行以完成某项任务的一类文件。

  3. 模块:Python模块是从另一个模块、脚本或解释器中导入的文件。更多关于Python模块的内容可参考Python文档


如何运行Python脚本”一文也讨论了三者的差别。


基于命令行执行


在这类方法中,Python脚本将通过命令行来执行。


执行脚本时,无法与Python解释器正在执行的代码交互。关于如何通过命令行执行代码的详细信息对本文而言并不重要,但您可以通过展开下框阅读更多有关Windows,Linux和macOS之间命令行差异的内容。


命令行环境


不同的操作系统在使用命令行执行代码时存在细微的差异。


在Linux和macOS中,通常使用如下命令:

美元符号($)之前的内容可能有所不同,具体取决于您的用户名和计算机名称。您键入的命令位于$之后。在Linux或macOS上,Python3的可执行文件名为python3,因此可以通过输入python3 script_name.py来运行python脚本。

在Windows上,命令提示符通常如下所示:

根据您的用户名,>之前的内容可能会有所不同,您输入的命令位于>之后。在Windows上,Python3的可执行文件通常为python。因此可以通过输入python script_name.py来运行python脚本。


无论哪种操作系统,本文的Python脚本的输出结果都是相同的。因此本文以Linux和macOS为例。

使用命令行执行execution_methods.py,如下所示:

在这个示例中,__name__具有值'__main__',其中引号(')表明该值为字符串类型。


请记住,在Python中,使用单引号(')和双引号(")定义的字符串没有区别。更多关于字符串的内容请参考Python的基本数据类型


如果在脚本中包含"shebang行"并直接执行它(./execution_methods.py),或者使用IPython或Jupyter Notebook的%run,将会获取相同的结果。


您还可以通过向命令行添加-m参数的方法实现以模块的方式执行。通常情况下,推荐如下方式pip: python3 -m pip install package_name。


添加-m参数将会运行包中__main__.py的代码。更多关于__main__.py文件的内容可参考如何将开源Python包发布到PyPI中


在三种情况中,__name__都具有相同的值:字符串'__main__'。


技术细节:Python文档中具体定义了__name__何时取值为'__main__'。


当通过标准输入,脚本或者交互提示中读取数据时,模块的__name__将取值为'__main__'。(来源


__name__与__doc__,__package__和其他属性一起存储在模块的全局命名空间。更多关于属性的信息可参考Python数据模型文档,特别是关于模块和包的信息,请参阅Python Import文档


导入模块或解释器


接下来是Python解释器执行代码的第二种方式:导入。在开发模块或脚本时,可以使用import关键字导入他人已经构建的模块。


在导入过程中,Python执行指定模块中定义的语句(但仅在第一次导入模块时)。要演示导入execution_methods.py文件的结果,需要启动Python解释器,然后导入execution_methods.py文件:

在此代码输出中,Python解释器执行了三次print()函数调用。前两行由于没有变量,在输出方面与在命令行上作为脚本执行时完全相同。但是第三个输出存在差异。


当Python解释器导入代码时,__name__的值与要导入的模块的名称相同。您可以通过第三行的输出了解这一点。__name__的值为'execution_methods',是Python导入的.py文件。


注意如果您在没有退出Python时再次导入模块,将不会有输出。


注意:更多关于导入在Python中如何工作的内容请参考官方文档Python中的绝对和相对导入


英文原文:https://realpython.com/python-main-function/ 
译者:我是昵称耶~
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/33491