杰瑞科技汇

python shell 运行py

使用 exec()open() 函数(不推荐)

这种方法是在 Python Shell 内部手动读取并执行一个 Python 脚本文件。

步骤:

  1. 打开 Python Shell:在你的终端或命令行中输入 pythonpython3,然后按回车。

    $ 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.
    >>> 
  2. 使用 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 文件的标准且推荐的方法,它的核心思想是将你的脚本作为一个模块导入。

步骤:

  1. 确保脚本文件存在:和上面一样,你有 my_script.py

  2. 打开 Python Shell

  3. 使用 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!
  • 代码复用:你可以像使用标准库一样,随时调用脚本中的功能,而无需重新运行整个文件。

  • 更清晰的错误处理:如果脚本有语法错误,你会得到一个清晰的 ImportErrorSyntaxError,Python Shell 仍然可以继续使用。

import 的两种主要形式

  1. import module_name (推荐)

    • 如上所示,整个模块被导入,访问其内容需要使用 module_name.function() 的形式,这是最清晰、最不容易产生命名冲突的方式。
  2. 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 列表中。

  1. 修改 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.")
  2. 从命令行运行:

    $ python my_script.py Alice Bob
    Script name: my_script.py
    Arguments received: ['Alice', 'Bob']
    Hello, Alice!
    Hello, Bob!
分享:
扫描分享到社交APP
上一篇
下一篇