这里的核心区别在于 执行 和 导入,这两种方式的用途和结果完全不同。

我会分三种最常见的情况来详细解释:
- 直接执行脚本
- 导入脚本作为模块
- 在Jupyter Notebook/Google Colab中引入脚本
直接执行脚本
这是最简单直接的方式,你想运行整个脚本,让它从头到尾执行一次。
如何做:
在你的终端(或命令提示符)中,使用 python 命令,后面跟上你的脚本文件名。
示例:
假设你有一个名为 my_script.py 的文件,内容如下:

# my_script.py
def greet(name):
print(f"Hello, {name}!")
if __name__ == "__main__":
print("This script is being run directly.")
greet("Alice")
print("Script finished.")
在终端中,你只需要运行:
python my_script.py
输出结果:
This script is being run directly.
Hello, Alice!
Script finished.
关键点:if __name__ == "__main__":
这是Python中一个非常重要的约定。
- 当你直接执行
my_script.py时,Python内置变量__name__的值是"__main__"。 if条件成立,if代码块内的代码会被执行。- 如果这个脚本被导入到另一个脚本中(见情况二),
__name__的值将是模块名(即"my_script"),if条件不成立,代码块内的代码就不会被执行。
导入脚本作为模块
当你想在一个脚本中使用另一个脚本中定义的函数、类或变量时,你需要导入它,这时,被导入的脚本就变成了一个模块。

如何做:
在你要编写新代码的Python环境(交互式解释器或另一个脚本文件)中,使用 import 语句。
示例:
你有一个新的脚本 main_script.py,你想使用 my_script.py 里的 greet 函数。
# main_script.py
import my_script # 导入 my_script.py 文件,它现在被视为一个模块
print("This is main_script.py.")
print("Now, let's use the function from my_script module.")
# 调用 my_script 模块中的 greet 函数
my_script.greet("Bob")
print("Done.")
执行 main_script.py:
python main_script.py
输出结果:
This is main_script.py.
Now, let's use the function from my_script module.
Hello, Bob!
Done.
注意:
- 因为
my_script.py是被import的,if __name__ == "__main__":里面的代码不会被执行,这就是为什么输出中没有 "This script is being run directly." 这句话。 - 你必须确保
main_script.py和my_script.py在同一个目录下,或者my_script.py所在的目录在Python的sys.path中,如果不在同一个目录,Python会找不到这个模块。
在Jupyter Notebook/Google Colab中引入脚本
在Jupyter Notebook或Google Colab这种交互式环境中,情况更加灵活,主要有三种方式。
准备工作:
假设你的工作目录中有一个 utils.py 文件,内容如下:
# utils.py
def add(a, b):
return a + b
PI = 3.14159
方法1: 使用 %run 魔法命令
这种方式最接近“直接执行”,它会像在命令行运行脚本一样,执行 utils.py 的所有代码,并且将所有变量和函数加载到当前Notebook的命名空间中。
# 在一个 Jupyter Cell 中
%run utils.py
# 执行完 %run 后,你就可以直接使用 utils.py 中的函数和变量了
result = add(10, 5)
print(f"The result is: {result}")
print(f"The value of PI is: {PI}")
输出:
The result is: 15
The value of PI is: 3.14159
方法2: 使用 import 语句
这与情况二在脚本中导入完全相同,它会创建一个名为 utils 的模块对象,你需要通过 utils.function() 来访问其内容。
# 在一个 Jupyter Cell 中
import utils
# 必须通过模块名来访问
result = utils.add(10, 5)
print(f"The result is: {result}")
print(f"The value of PI is: {utils.PI}")
方法3: 使用 importlib 库(动态导入)
这是一种更高级的动态导入方式,可以在代码运行时导入模块,当你需要根据条件或变量来决定导入哪个模块时很有用。
import importlib
# 动态导入 'utils' 模块
importlib.import_module("utils")
# 现在可以像直接导入一样使用了
result = add(10, 5)
print(f"The result is: {result}")
print(f"The value of PI is: {PI}")
注意: importlib 导入后,模块内容也会进入当前命名空间,效果类似于 %run,但过程更可控。
总结与最佳实践
| 方法 | 命令/语句 | 用途 | 结果 | 适用场景 |
|---|---|---|---|---|
| 直接执行 | python script.py (在终端) |
运行一个完整的程序或任务。 | 脚本从头到尾执行一次。 | 命令行工具、数据分析流程、自动化任务。 |
| 导入模块 | import script (在代码中) |
重用另一个脚本中的函数、类或变量。 | 被导入的脚本不自动执行可通过模块名访问。 | 构建大型应用、库开发、共享工具函数。 |
| Notebook执行 | %run script.py |
快速加载一个外部脚本的所有内容到当前交互环境。 | 被执行,所有变量和函数直接可用。 | 快速原型设计、测试、教学。 |
| Notebook导入 | import script |
在Notebook中有选择地使用外部脚本的功能。 | 被加载,但需通过模块名访问。 | 保持代码整洁,避免命名冲突。 |
最佳实践建议:
- 为你的脚本写一个
if __name__ == "__main__":块,这是专业Python代码的标志,把那些只想在脚本直接运行时执行的代码(如测试、主程序入口)放在这里面,这样,别人导入你的模块时就不会意外运行这些代码。 - 保持模块的纯粹性:一个被设计为
import的模块,应该只包含定义(函数、类、变量),而不应该包含大量的打印或直接执行的业务逻辑,把业务逻辑放在if __name__ == "__main__":块里。 - 使用清晰的文件名:模块名(文件名)应该是小写、下划线命名法(如
my_utils.py),不要有空格或特殊字符。
希望这个详细的解释能帮助你完全理解如何在Python环境中引入和使用脚本!
