Python社区  »  Python

ipython评估本地目录中的文件[重复]

Philippe EL TEGANI MOHAMED • 8 月前 • 84 次点击  

似乎他们在python 3中取消了所有通过删除来快速加载脚本的简单方法 execfile()

有没有一个明显的替代品我不见了?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/39936
 
84 次点击  
分享到微博
文章 [ 11 ]  |  最新文章 8 月前
Claude
Reply   •   1 楼
Claude    3 年前

我只是一个新手,所以如果我发现了这个,也许真的很幸运:

尝试使用命令在解释器提示符下运行脚本后

    execfile('filename.py')

我得到了一个“nameerror:name'execfile'未定义”我尝试了一个非常基本的

    import filename

效果很好:-)

我希望这能有所帮助,并感谢大家伟大的提示,例子和所有那些巧妙的评论代码,是一个伟大的灵感新人!

我用的是ubuntu 16.014lts x64。 Python 3.5.2(默认值,2016年11月17日,17:05:23) Linux上的[GCC 5.4.0 20160609]

R S
Reply   •   2 楼
R S    3 年前

另外,虽然不是纯python解决方案,但如果您使用的是ipython(可能无论如何都应该这样做),您可以:

%run /path/to/filename.py

这同样容易。

Eric
Reply   •   3 楼
Eric    9 年前

注意,如果使用pep-263编码声明,上述模式将失败 那不是ascii或utf-8。你需要找到数据的编码,并对其进行编码 在将其交给exec()之前正确。

class python3Execfile(object):
    def _get_file_encoding(self, filename):
        with open(filename, 'rb') as fp:
            try:
                return tokenize.detect_encoding(fp.readline)[0]
            except SyntaxError:
                return "utf-8"

    def my_execfile(filename):
        globals['__file__'] = filename
        with open(filename, 'r', encoding=self._get_file_encoding(filename)) as fp:
            contents = fp.read()
        if not contents.endswith("\n"):
            # http://bugs.python.org/issue10204
            contents += "\n"
        exec(contents, globals, globals)
ArtOfWarfare
Reply   •   4 楼
ArtOfWarfare    5 年前

这是我所拥有的( file 已分配给文件的路径,两个示例中都有源代码):

execfile(file)

我把它换成了:

exec(compile(open(file).read(), file, 'exec'))

我最喜欢的部分是:第二个版本在Python2和3中都工作得很好,这意味着不需要添加依赖于版本的逻辑。

Tim Lesher ascobol
Reply   •   5 楼
Tim Lesher ascobol    8 年前

如果要加载的脚本与运行的脚本位于同一目录中,则“导入”可能会执行该任务?

如果需要动态导入代码,则内置函数 __ import__ 以及模块 imp 值得一看。

>>> import sys
>>> sys.path = ['/path/to/script'] + sys.path
>>> __import__('test')
<module 'test' from '/path/to/script/test.pyc'>
>>> __import__('test').run()
'Hello world!'

测试.py:

def run():
        return "Hello world!"

如果您使用的是Python3.1或更高版本,您还应该看看 importlib

Noam
Reply   •   6 楼
Noam    10 年前

这一个更好,因为它从调用方获取全局和局部:

import sys
def execfile(filename, globals=None, locals=None):
    if globals is None:
        globals = sys._getframe(1).f_globals
    if locals is None:
        locals = sys._getframe(1).f_locals
    with open(filename, "r") as fh:
        exec(fh.read()+"\n", globals, locals)
Honest Abe David Cournapeau
Reply   •   7 楼
Honest Abe David Cournapeau    7 年前

您可以编写自己的函数:

def xfile(afile, globalz=None, localz=None):
    with open(afile, "r") as fh:
        exec(fh.read(), globalz, localz)

如果你真的需要…

Jonas Schäfer
Reply   •   8 楼
Jonas Schäfer    5 年前

AS suggested on the python-dev 最近的邮件列表 runpy 模块可能是一个可行的替代方案。引用该消息:

https://docs.python.org/3/library/runpy.html#runpy.run_path

import runpy
file_globals = runpy.run_path("file.py")

有细微的差别 execfile :

  • run_path 总是创建一个新的命名空间。它以模块的形式执行代码,因此全局变量和局部变量之间没有区别(这就是为什么只有 init_globals 参数)。返回全局。

    执行文件 在当前命名空间或给定命名空间中执行。语义学 locals globals ,如果给定,则类似于类定义中的局部变量和全局变量。

  • 运行路径 不仅可以执行文件,还可以执行鸡蛋和目录(有关详细信息,请参阅其文档)。

ideasman42
Reply   •   9 楼
ideasman42    1 年前

同时 exec(open("filename").read()) 通常作为 execfile("filename") ,它忽略了重要的细节 execfile 支持。

python3.x的以下函数与直接执行文件的行为非常接近。与跑步相匹配 python /path/to/somefile.py .

def execfile(filepath, globals=None, locals=None):
    if globals is None:
        globals = {}
    globals.update({
        "__file__": filepath,
        "__name__": "__main__",
    })
    with open(filepath, 'rb') as file:
        exec(compile(file.read(), filepath, 'exec'), globals, locals)

# execute the file
execfile("/path/to/somefile.py")

笔记:

  • 使用二进制读取来避免编码问题
  • 保证关闭文件 (python3.x对此发出警告)
  • 定义 __main__ ,一些脚本依赖于此来检查它们是否作为模块加载。 if __name__ == "__main__"
  • 设置 __file__ 对于异常消息和一些脚本使用 _文件__ 获取其他文件相对于它们的路径。
  • 接受可选的全局参数和局部参数,将它们修改为 执行文件 这样您就可以在运行后通过读取变量来访问任何定义的变量。

  • 不像蟒蛇 执行文件 这是真的 默认情况下修改当前命名空间。为此,你必须明确地传递 globals() 和; locals()

Honest Abe David Cournapeau
Reply   •   10 楼
Honest Abe David Cournapeau    7 年前

你只需要自己读取文件并执行代码。2to3电流替代

execfile("somefile.py", global_vars, local_vars)

作为

with open("somefile.py") as f:
    code = compile(f.read(), "somefile.py", 'exec')
    exec(code, global_vars, local_vars)

(编译调用不是严格需要的,但它将文件名与代码对象相关联,从而使调试变得更容易。)

见:

Stevoisiak
Reply   •   11 楼
Stevoisiak    2 年前

According to the documentation ,而不是

execfile("./filename") 

使用

exec(open("./filename").read())

见: