许多编程语言都有一个非凡的函数,当操作系统开始运行程序时会主动执行该函数。这个函数通常被命名为 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 解释器执行代码有两种形式:
通过命令行形式执行 Python 脚本。
将代码从一个文件导入另一个文件或者解释器。
更多内容可参考如何运行 Python 脚本。无论采纳哪种形式,Python 都会定义一个名为__name__的非凡变量,该变量蕴含一个字符串,其值取决于代码的应用形式。
本文将如下示例文件保留为 execution_methods.py,以摸索代码如何依据上下文扭转行为:
在此文件中,定义了三个对 print()函数的调用。前两个打印一些介绍性短语。第三个 print()会先打印短语 The value name is,之后将应用 Python 内置的 repr()函数打印出__name__变量。
在 Python 中,repr()函数将对象转化为供解释器读取的模式。上述示例通过应用 repr()函数来强调__name__的值为字符串。更多对于 repr()的内容可参考 Python 文档。
在本文中,您将随处可见文件 (file),模块(module) 和脚本 (script) 这三个字眼。实际上,三者之间并无太大的差异。不过,在强调代码目标时,还是存在轻微的差别:
文件:通常,Python 文件是蕴含代码的任何文件。大多数 Python 文件的扩大名为.py。
脚本:Python 脚本是基于命令行执行以实现某项工作的一类文件。
模块: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 时再次导入模块,将不会有输入。