【问题标题】:How to execute a file within the Python interpreter?如何在 Python 解释器中执行文件?
【发布时间】:2010-11-04 21:22:29
【问题描述】:

我正在尝试使用解释器中的 Python 命令执行文件。

编辑:我正在尝试使用该文件中的变量和设置,而不是调用单独的进程。

【问题讨论】:

    标签: python


    【解决方案1】:

    对于 Python 2:

    >>> execfile('filename.py')
    

    对于 Python 3:

    >>> exec(open("filename.py").read())
    # or
    >>> from pathlib import Path
    >>> exec(Path("filename.py").read_text())
    

    the documentation。如果您使用的是 Python 3.0,请参阅this question

    请参阅@S.Lott 的回答,了解执行后如何从 filename.py 访问全局变量的示例。

    【讨论】:

    【解决方案2】:

    几种方法。

    从外壳

    python someFile.py
    

    在 IDLE 中,按 F5

    如果您以交互方式输入,请尝试以下操作:(仅限 Python 2!)

    >>> variables= {}
    >>> execfile( "someFile.py", variables )
    >>> print variables # globals from the someFile module
    

    对于 Python3,使用:

    >>> exec(open("filename.py").read())
    

    【讨论】:

    • python 在运行 python 3 时不起作用,而是使用 python3
    • Execfile 在 python3 中不再存在,并且 exec() 似乎没有以某种方式工作......不知道我做错了什么。你能更新答案吗?
    • 有没有办法从文件中提供stdin,例如使用<execfile() 中的执行脚本? @s-lott
    • @pzkpfw python 可以指向任何版本的 python。我见过 only python v3 的环境,其中python 指向python3
    • @pzkpfw 这取决于系统在查看环境变量PATH 中的文件夹时发现的python 可执行文件。
    【解决方案3】:

    我正在尝试使用该文件中的变量和设置,而不是调用单独的进程。

    好吧,只需使用 import filename(减去 .py,需要在同一目录中或在您的 PYTHONPATH 上)导入文件即可运行该文件,使其变量、函数、类等在filename.variable 命名空间。

    因此,如果您有 cheddar.py 与变量 spam 和函数鸡蛋 - 您可以使用 import cheddar 导入它们,使用 cheddar.spam 访问变量并通过调用 cheddar.eggs() 运行函数

    如果您在cheddar.py 中有位于函数之外的代码,它将立即运行,但是构建在导入时运行的应用程序将难以重用您的代码。如果可能,请将所有内容放在函数或类中。

    【讨论】:

    • 这不会使用全局命名空间,因为问题需要。改用from filename import *
    • 问题没有具体提到使用全局命名空间,这可能是OP想要的,但从问题中并不明显。
    【解决方案4】:

    我不是专家,但这是我注意到的:

    例如,如果您的代码是 mycode.py,并且您只键入“import mycode”,Python 将执行它,但它不会使您的所有变量都可用于解释器。我发现如果你想让所有变量对解释器可用,你实际上应该输入'from mycode import *'。

    【讨论】:

    • 另外,它应该是评论,而不是答案。
    【解决方案5】:

    Python 2 + Python 3

    exec(open("./path/to/script.py").read(), globals())
    

    这将执行一个脚本并将它的所有全局变量放在解释器的全局范围内(大多数脚本环境中的正常行为)。

    Python 3 exec Documentation

    【讨论】:

    • 你是我的英雄!几天来,我一直在与一些非常奇怪的东西作斗争,其中 os.getcwd() 说了一件事,但 glob("*") 在另一个目录中工作......谢谢!谢谢!
    • 有没有办法将参数传递给脚本?以下不起作用: exec(open"setup.py install").read(), globals())
    • @ben 这不起作用,因为open 直接从脚本中读取代码。要传递参数,请查看this answer,但不是execfile,显然使用execopen,如上所示。
    【解决方案6】:

    对于 python3 使用 xxxx = nameyourfile

    exec(open('./xxxx.py').read())
    

    【讨论】:

      【解决方案7】:

      很惊讶我还没有看到这个。您可以使用-i 选项执行文件,然后在执行终止后让解释器保持打开状态:

      | foo.py |
      ----------
      testvar = 10
      
      def bar(bing):
        return bing*3
      
      --------
      
      
      
      $ python -i foo.py
      >>> testvar 
      10
      >>> bar(6)
      18
      

      【讨论】:

        【解决方案8】:

        在我看来,最好的办法是:

        import yourfile
        

        在修改 yourfile.py 之后

        reload(yourfile)   
        

        或者在python3中:

        import imp; 
        imp.reload(yourfile)
        

        但这会使函数和类看起来像这样: yourfile.function1, yourfile.class1.....

        如果你不能接受这些, 最后的解决方案是:

        reload(yourfile)
        from yourfile import *
        

        【讨论】:

        • 是的...这似乎是最好的方法... THX!但是...重新加载对我不起作用...我在 Python 3.9.5...有什么想法吗???
        • @ZEE,我使用的是 python 3.8.5,我可以使用:from importlib import reload。看起来imp 已合并到importlib
        【解决方案9】:

        做吧,

        from my_file import *
        

        确保不要添加 .py 扩展名。如果您在子目录中使用 .py 文件,

        from my_dir.my_file import *
        

        【讨论】:

          【解决方案10】:

          对于 Python 3:

          >>> exec(open("helloworld.py").read())
          

          在运行命令之前确保您位于正确的目录中。

          要从不同的目录运行文件,可以使用以下命令:

          with open ("C:\\Users\\UserName\\SomeFolder\\helloworld.py", "r") as file:
              exec(file.read())
          

          【讨论】:

            【解决方案11】:

            假设您需要以下功能:

            1. 源文件在您的调试器中正常运行(文件名显示在堆栈中等)
            2. __name__ == '__main__' 为 True,因此脚本可以像脚本一样正常运行。

            exec(open('foo.py').read()) 功能 1 失败 import foo 策略失败了功能 2

            要同时获得这两个,你需要这个:

                source = open(filename).read()
                code = compile(source, filename, 'exec')
                exec(code)
            

            【讨论】:

              【解决方案12】:
              python -c "exec(open('main.py').read())"
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2012-05-01
                • 2020-04-22
                • 2020-06-22
                • 2017-03-21
                • 1970-01-01
                • 2023-03-11
                • 1970-01-01
                相关资源
                最近更新 更多