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


289

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

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


2
os模块,我正在检查其他答案。
亚当·马坦

2
建议的操作系统 当我阅读编辑时删除了答案:-/
lightong 2014年

Answers:


229

几种方法。

从外壳

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())

10
python如果您正在运行python 3,python3则不起作用,而是使用python 3 。
pzkpfw

41
Execfile在python3中不再存在,并且exec()似乎无法以某种方式工作...不确定我在做什么错。你能更新答案吗?
临时用户名

有没有什么办法可以stdin从文件中提供诸如使用<到。中的执行脚本execfile()?@ s-lott
bhanu

9
@pzkpfw python可以指向任何版本的python。我看到只有 python v3 python指向的环境python3
–StockB

2
@pzkpfw取决于python系统通过环境变量中的文件夹查找时找到的可执行文件PATH
HelloGoodbye

253

对于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,请参见此问题

有关执行后如何从filename.py访问全局变量的示例,请参见@ S.Lott的答案。


读取方法有什么作用?不幸的是,官方文档站点没有提供清晰的示例和解释。
德米特里(Dmitry)

它读取文件并以单个字符串返回(默认情况下)全部内容,请参见例如open文件上的w3schools页面
最高

以下是open()的文档:docs.python.org/3/library/io.html
codeape

96

Python 2 + Python 3

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

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

Python 3 exec文档


1
你是我的英雄!在os.getcwd()说了一件事的日子里,我一直在与一些真正奇怪的东西作斗争,但是glob(“ *”)在另一个目录中工作了……谢谢!谢谢!
pallevillesen

有没有办法将参数传递给脚本?下列情况不工作:EXEC(开放“的setup.py安装”)阅读(),全局())。

1
@ben无效,因为open直接从脚本中读取了代码。要传递参数,请查看此答案,但execfile显然使用exec和而不是,open如上所示。
Nico

47

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

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

def bar(bing):
  return bing*3

--------



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

30

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

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

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

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


4
正如问题所要求的那样,它不会使用全局名称空间。改用from filename import *
里卡多·克鲁兹

这个问题没有特别提到使用全局名称空间,这可能是OP想要的,但是从这个问题来看并不明显。
ryanpcmcquen

13

我认为最好的方法是:

import yourfile

并在修改yourfile.py之后

reload(yourfile)   

要么

import imp; 
imp.reload(yourfile) in python3

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

如果您不能接受,那么最终的解决方案是:

reload(yourfile)
from yourfile import *

9

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

例如,如果您的代码是mycode.py,而您只键入“ import mycode”,则Python将执行该代码,但不会使您的所有变量都可用于解释器。我发现如果要将所有变量提供给解释器,则应键入“ from mycode import *”。


3
另外,它应该是评论,而不是答案。
亚当·马坦

9

做就是了,

from my_file import *

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

from my_dir.my_file import *

在我看来,这是最优雅的。
Massimiliano Kraus

8

对于python3使用或者与xxxx = nameyourfile

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

8

对于Python 3:

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

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

要从其他目录运行文件,可以使用以下命令:

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

1

假设您需要以下功能:

  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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.