Skip to content

可执行脚本 / 模块

除了包含定义之外,模块还可以包含代码块,每当独立脚本以脚本模式运行时,该代码块就会执行。该块必须包含在 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
>>>