可执行脚本 / 模块
除了包含定义之外,模块还可以包含代码块,每当独立脚本以脚本模式运行时,该代码块就会执行。该块必须包含在 if
语句中,如下所示:
python
if __name__ == '__main__':
...要执行的代码...
__name__
是一个内置变量。当 Python 解释器直接运行一个脚本文件时,该脚本的 __name__
会被设置为字符串 '__main__'
。当脚本被其他模块导入时,__name__
会被设置为该模块的名称(即文件名,不带 .py
后缀)。
因此,if __name__ == '__main__':
下的代码块只有在直接运行该脚本文件时才会执行,而在被导入时不会执行。
使用上述模式,文件既可以作为模块被导入,也可以直接作为脚本执行。
让我们看一个示例模块(将其另存为 multi.py
),该模块将两个数字相乘:
python
#multi.py (版本 1:没有 if __name__ == '__main__')
def multiply(a, b):
return a * b
#这部分代码无论导入还是直接运行都会执行
print("multi.py 被加载了!")
f = int(input("输入 a: "))
s = int(input("输入 b: "))
print("乘积是:", multiply(f, s))
现在,当我们尝试从该模块导入所有函数时,它会自动执行输入赋值语句并打印输出。
python
>>> import multi # 或者 from multi import *
multi.py 被加载了!
输入 a: 4
输入 b: 5
乘积是: 20
>>> multi.multiply(2, 3) # 函数仍然可用
6
让我们修改代码,使用 if __name__ == '__main__'
:
python
#multi.py (版本 2:使用 if __name__ == '__main__')
def multiply(a, b):
return a * b
print("multi.py 的 __name__ 是:", __name__) # 看看 __name__ 的值
if __name__ == '__main__':
print("multi.py 作为主程序运行")
f = int(input("输入 a: "))
s = int(input("输入 b: "))
print("乘积是:", multiply(f, s))
现在,该块仅在直接执行脚本时执行,而在将文件作为模块导入时不会执行。
直接运行 multi.py
:
bash
$ python multi.py
multi.py 的 __name__ 是: __main__
multi.py 作为主程序运行
输入 a: 4
输入 b: 5
乘积是: 20
在 Python 解释器中导入:
python
>>> import multi
multi.py 的 __name__ 是: multi # __name__ 是模块名
>>> multi.multiply(2, 3)
6
>>>