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 脚本。