使用 exec() 和 open() 函数(不推荐)
这种方法是在 Python Shell 内部手动读取并执行一个 Python 脚本文件。
步骤:
-
打开 Python Shell:在你的终端或命令行中输入
python或python3,然后按回车。$ python Python 3.9.7 (default, Sep 16 2025, 16:59:28) [Clang 12.0.0 (clang-1200.0.32.29)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>>
-
使用
exec()和open():open('文件名.py', 'r', encoding='utf-8'):以只读模式打开你的 Python 文件,并指定编码为 UTF-8(这是一个好习惯,可以避免编码问题)。.read():读取文件的全部内容。exec(...):执行读取到的代码字符串。
示例: 假设你有一个名为
my_script.py的文件,内容如下:# my_script.py def greet(name): print(f"Hello, {name}!") if __name__ == "__main__": greet("from the script")在 Python Shell 中运行它:
>>> exec(open('my_script.py').read()) Hello, from the script!
优点:
- 简单直接,无需离开 Python Shell。
缺点:
- 强烈不推荐,这种方法会丢失脚本的原始上下文和命名空间,如果
my_script.py中定义了一个函数或变量,执行后你无法在 Shell 中直接使用它。>>> # 继续上面的例子 >>> greet("Alice") # 尝试调用脚本中的函数 Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'greet' is not defined - 如果脚本中有语法错误,错误信息可能会比较混乱,难以定位。
- 无法向脚本传递命令行参数。
使用 import 语句(推荐)
这是在 Python Shell 中运行 .py 文件的标准且推荐的方法,它的核心思想是将你的脚本作为一个模块导入。
步骤:
-
确保脚本文件存在:和上面一样,你有
my_script.py。 -
打开 Python Shell。
-
使用
import语句: 直接导入文件名(注意不要带.py后缀)。>>> import my_script Hello, from the script!
为什么这是更好的方法?
-
保留命名空间:导入后,脚本中定义的所有函数、类和变量都会被加载到 Python Shell 的一个模块命名空间中,你可以通过
模块名.属性名的方式访问它们。>>> # 继续上面的例子 >>> my_script.greet("Bob") Hello, Bob! >>> # 你甚至可以重新定义脚本中的函数 >>> my_script.greet = lambda name: print(f"Hi there, {name}!") >>> my_script.greet("Charlie") Hi there, Charlie! -
代码复用:你可以像使用标准库一样,随时调用脚本中的功能,而无需重新运行整个文件。
-
更清晰的错误处理:如果脚本有语法错误,你会得到一个清晰的
ImportError或SyntaxError,Python Shell 仍然可以继续使用。
import 的两种主要形式
-
import module_name(推荐)- 如上所示,整个模块被导入,访问其内容需要使用
module_name.function()的形式,这是最清晰、最不容易产生命名冲突的方式。
- 如上所示,整个模块被导入,访问其内容需要使用
-
from module_name import function_name(特定导入)- 如果你只需要脚本中的某一个或几个特定功能,可以使用这种方式。
- 这些功能会被直接导入到当前的命名空间中,可以直接调用,无需
module_name.前缀。
示例:
>>> from my_script import greet >>> greet("David") Hello, David!注意:如果脚本中有
if __name__ == "__main__":块,使用from ... import时,这部分代码不会自动执行,只有import module_name会执行模块顶层(不在函数或类内部)的代码。
总结与最佳实践
| 特性 | exec(open('file').read()) |
import module_name |
|---|---|---|
| 推荐度 | ⭐☆☆☆☆ (不推荐) | ⭐⭐⭐⭐⭐ (强烈推荐) |
| 命名空间 | 丢失,所有代码在全局命名空间执行 | 保留,代码在模块的命名空间中 |
| 代码复用 | ❌ 无法复用脚本中的函数/变量 | ✅ 可以随时调用 module.func() |
| 错误处理 | 混乱,难以调试 | 清晰,易于定位 |
执行 if __name__ == "__main__": |
✅ 会执行 | ✅ 会执行(顶层代码) |
| 适用场景 | 几乎没有,临时测试一小段代码 | 测试模块、调试、交互式开发 |
请始终使用 import 语句来在 Python Shell 中运行 .py 文件。
这样做不仅能正确执行你的脚本,还能让你在交互式环境中方便地测试和复用脚本中的代码,这是 Python Shell 最强大的功能之一。
补充:如何从命令行运行 .py 文件
虽然你的问题是关于 Python Shell 的,但了解如何从命令行运行脚本也非常重要,这是最常见的运行方式。
在终端(不是 Python Shell 内部)中,使用 python 命令:
# python your_script.py
示例:
$ python my_script.py Hello, from the script!
带参数运行:
你还可以向脚本传递参数,这些参数会存储在 sys.argv 列表中。
-
修改
my_script.py:# my_script.py import sys if __name__ == "__main__": print(f"Script name: {sys.argv[0]}") if len(sys.argv) > 1: print(f"Arguments received: {sys.argv[1:]}") for arg in sys.argv[1:]: print(f"Hello, {arg}!") else: print("No arguments provided.") -
从命令行运行:
$ python my_script.py Alice Bob Script name: my_script.py Arguments received: ['Alice', 'Bob'] Hello, Alice! Hello, Bob!
