社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Philippe EL TEGANI MOHAMED • 6 年前 • 1827 次点击  

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

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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/39936
文章 [ 11 ]  |  最新文章 6 年前
Claude
Reply   •   1 楼
Claude    8 年前

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

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

    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    8 年前

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

%run /path/to/filename.py

这同样容易。

Eric
Reply   •   3 楼
Eric    14 年前

注意,如果使用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    11 年前

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

execfile(file)

我把它换成了:

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

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

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

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

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

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

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    12 年前

您可以编写自己的函数:

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    11 年前

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    6 年前

同时 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    12 年前

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

According to the documentation ,而不是

execfile("./filename") 

使用

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

见: