如何在Python解释器中执行文件?

383
我正在尝试从解释器内部执行一个包含Python命令的文件。
我想要使用该文件中的变量和设置,而不是调用一个单独的进程。
12个回答

334

有几种方法。

  • 通过 shell

  • python someFile.py
    
  • 从IDLE内部,按下F5

  • 如果你正在交互式地输入内容,尝试以下方法(Python3):

  • >>> exec(open("filename.py").read())
    
  • 对于Python 2:

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

2
有没有办法在execfile()中像使用<一样从文件提供stdin给执行脚本?@s-lott - bhanu
12
@pzkpfw 的意思是 Python 可以指向任何版本的 Python。我曾看到只有 Python v3 的环境,其中 python 指向 python3 - StockB
2
@pzkpfw 这取决于系统在环境变量 PATH 中查找文件夹时找到的 python 可执行文件。 - HelloGoodbye
对于随机的GIS人员,我可以在ArcGIS Pro中调用此命令: exec(open("D:\Scripts\myscript.py").read()) - woodwa
我发现F5快捷键只适用于Spyder,并且它会运行已经打开的temp.py文件。如果我只在Conda提示符下运行python命令,按下F5键没有任何效果。 - undefined

276

对于 Python 2:

>>> execfile('filename.py')

对于Python 3:

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

请查看文档。如果您正在使用Python 3.0,请查看此问题

请看@S.Lott的答案,了解在执行filename.py后如何访问全局变量的示例。


read方法是做什么的?不幸的是,官方文档网站没有提供清晰的示例和解释。 - Dmitry
它读取文件并返回(默认情况下)一个字符串中的所有内容,在这里可以查看 w3schools 关于文件打开的页面 - Max
这里是 open() 的文档:https://docs.python.org/3/library/io.html - codeape

109

Python 2 + Python 3

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

这将执行一个脚本,并将其所有全局变量放入解释器的全局作用域中(在大多数脚本环境中是正常行为)。

Python 3 exec 文档


有没有办法将参数传递给脚本?以下方法不起作用:exec(open"setup.py install").read(), globals())。 - ben
2
@ben 这样做行不通,因为 open 直接从脚本中读取代码。要传递参数,请参考这个答案,但是显然要使用上面所示的 execopen,而不是 execfile - Nico

79

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

| foo.py |
----------
testvar = 10

def bar(bing):
  return bing*3

--------



$ python -i foo.py
>>> testvar 
10
>>> bar(6)
18

32

我想要使用文件中的变量和设置,而不是调用单独的进程。

那么,只需使用import filename(去掉.py,必须在相同的目录或您的PYTHONPATH上)导入该文件,将使其变量、函数、类等在filename.variable命名空间中可用。

因此,如果您有一个名为cheddar.py的文件,其中包含变量spam和函数eggs - 您可以通过import cheddar导入它们,通过cheddar.spam访问变量,并通过调用cheddar.eggs()运行函数。

如果cheddar.py中的代码不在函数之内,则会立即运行它,但构建依赖导入运行的应用程序会使重复使用代码变得困难。如果可能的话,请将所有内容放在函数或类中。


4
使用from filename import *代替,这样就不会使用全局命名空间,正如问题所要求的那样。 - Ricardo Magalhães Cruz
问题并没有明确提到使用全局命名空间,这可能是提问者想要的,但从问题中并不明显。 - ryanpcmcquen

19

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

import yourfile

并且在修改yourfile.py之后

reload(yourfile)   

或者在Python3中:

import imp; 
imp.reload(yourfile)

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

如果您无法接受这些,最终的解决方案是:

reload(yourfile)
from yourfile import *

1
是的...这似乎是最好的方法...谢谢!但是...重新加载对我不起作用...我使用的是Python 3.9.5...有什么想法吗? - ZEE
1
@ZEE,我正在使用Python 3.8.5版本,可以使用以下代码:from importlib import reload。看起来imp已经合并到了importlib中。 - Neo li

12

只需要去做,

from my_file import *

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

from my_dir.my_file import *

9

对于Python 3:

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

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

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

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

8

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

如果您的代码文件名为mycode.py,而您只输入'import mycode',Python会执行它,但不会将所有变量都提供给解释器。我发现,如果您想要将所有变量提供给解释器,实际上应该输入'from mycode import *'。


5
此外,应该是一条评论,而不是答案。 - Adam Matan

8

对于Python3,请使用 xxxx = nameyourfile 中的任何一个。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接