Python 的顶层脚本环境(__main__)


模块对象具有各种属性。属性名称以双下划线 __ 为前缀和后缀。模块最重要的属性是 __name__。当 Python 作为顶层可执行代码运行时,即当从标准输入、脚本或交互式提示符读取时,__name__ 属性设置为 '__main__'。

>>> __name__
'__main__'

在脚本内部,我们也发现 __name__ 属性的值被设置为 '__main__'。执行以下脚本。

'module docstring'
print ('name of module:',__name__)

输出

name of module: __main__

但是,对于导入的模块,此属性设置为 Python 脚本的名称。对于 hello.py 模块

>>> import hello
>>> hello.__name__
hello

如前所述,顶层模块的 __name__ 值设置为 __main__。但是,对于导入的模块,它设置为文件名称。运行以下脚本 (moduletest.py)

import hello
print ('name of top level module:', __name__)
print ('name of imported module:', hello.__name__)

输出

name of top level module: __main__
name of imported module: hello

包含函数的 Python 脚本也可能具有一定的可执行代码。因此,如果我们导入它,它的代码将自动运行。我们有这个脚本 messages.py,其中包含两个函数。在可执行部分,用户输入作为参数提供给 thanks() 函数。

def welcome(name):
print ("Hi {}. Welcome to TutorialsPoint".format(name))
return
def thanks(name):
print ("Thank you {}. See you again".format(name))
name = input('enter name:')
thanks(name)

显然,当我们运行 messages.py 时,输出显示如下感谢消息。

enter name:Ajit
Thank you Ajit. See you again

我们有一个 moduletest.py 脚本如下。

import messages
print ('name of top level module:', __name__)
print ('name of imported module:', messages.__name__)

现在,如果我们运行 moduletest.py 脚本,我们会发现输入语句和对 welcome() 的调用将被执行。

c:\python37>python moduletest.py

输出

enter name:Kishan
Thank you Kishan. See you again
enter name:milind
Hi milind. Welcome to TutorialsPoint

这是两个脚本的输出。但想要从 messages 模块导入函数,但不希望其中包含的可执行代码运行。

这就是顶层脚本的 __name__ 属性值为 __main__ 的有用之处。修改 messages.py 脚本,使其仅当 __name__ 等于 __main__ 时才执行输入和函数调用语句。

"docstring of messages module"
def welcome(name):
print ("Hi {}. Welcome to TutorialsPoint".format(name))
return
def thanks(name):
print ("Thank you {}. See you again".format(name))
if __name__=='__main__':
name = input('enter name')
thanks(name)

无论何时想要一个既可以执行又可以导入的模块,都可以使用上述技术。moduletest.py 不需要任何更改。messages 模块中的可执行部分现在不会运行。

enter name: milind
Hi milind. Welcome to TutorialsPoint

请注意,这不会阻止您独立运行 messages.py 脚本。

更新于: 2020-06-27

521 次浏览

启动您的 职业生涯

通过完成课程获得认证

开始学习
广告