代码之家  ›  专栏  ›  技术社区  ›  Philippe

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

  •  0
  • Philippe  · 技术社区  · 8 年前

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

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

    0 回复  |  直到 7 年前
        1
  •  321
  •   Stevoisiak    8 年前

    According to the documentation ,而不是

    execfile("./filename") 
    

    使用

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

    见:

        2
  •  201
  •   Honest Abe Cody Piersall    13 年前

    你只需要自己读取文件并执行代码。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)
    

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

    见:

        3
  •  54
  •   ideasman42    7 年前

    同时 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() 。

        4
  •  50
  •   Jonas Schäfer    12 年前

    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 ,如果给定,则类似于类定义中的局部变量和全局变量。

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

        5
  •  18
  •   Honest Abe Cody Piersall    13 年前

    您可以编写自己的函数:

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

    如果你真的需要…

        6
  •  17
  •   Noam    16 年前

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

    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)
    
        7
  •  11
  •   Tim Lesher    14 年前

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

    如果需要动态导入代码,则内置函数 __ 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 。

        8
  •  8
  •   ArtOfWarfare    12 年前

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

    execfile(file)
    

    我把它换成了:

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

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

        9
  •  5
  •   Eric    15 年前

    注意,如果使用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)
    
        10
  •  2
  •   R S    9 年前

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

    %run /path/to/filename.py
    

    这同样容易。

        11
  •  1
  •   Claude    9 年前

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

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

        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]