What is an alternative to execfile in Python 3?

前端 未结 12 1775
滥情空心
滥情空心 2020-11-22 02:33

It seems they canceled in Python 3 all the easy way to quickly load a script by removing execfile()

Is there an obvious alternative I\'m missing?

相关标签:
12条回答
  • 2020-11-22 02:44

    This one is better, since it takes the globals and locals from the caller:

    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)
    
    0 讨论(0)
  • 2020-11-22 02:51

    As suggested on the python-dev mailinglist recently, the runpy module might be a viable alternative. Quoting from that message:

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

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

    There are subtle differences to execfile:

    • run_path always creates a new namespace. It executes the code as a module, so there is no difference between globals and locals (which is why there is only a init_globals argument). The globals are returned.

      execfile executed in the current namespace or the given namespace. The semantics of locals and globals, if given, were similar to locals and globals inside a class definition.

    • run_path can not only execute files, but also eggs and directories (refer to its documentation for details).

    0 讨论(0)
  • 2020-11-22 02:56

    If the script you want to load is in the same directory than the one you run, maybe "import" will do the job ?

    If you need to dynamically import code the built-in function __ import__ and the module imp are worth looking at.

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

    test.py:

    def run():
            return "Hello world!"
    

    If you're using Python 3.1 or later, you should also take a look at importlib.

    0 讨论(0)
  • 2020-11-22 02:59

    Note that the above pattern will fail if you're using PEP-263 encoding declarations that aren't ascii or utf-8. You need to find the encoding of the data, and encode it correctly before handing it to 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)
    
    0 讨论(0)
  • 2020-11-22 03:01

    You are just supposed to read the file and exec the code yourself. 2to3 current replaces

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

    as

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

    (The compile call isn't strictly needed, but it associates the filename with the code object making debugging a little easier.)

    See:

    • http://docs.python.org/release/2.7.3/library/functions.html#execfile
    • http://docs.python.org/release/3.2.3/library/functions.html#compile
    • http://docs.python.org/release/3.2.3/library/functions.html#exec
    0 讨论(0)
  • 2020-11-22 03:01

    I'm just a newbie here so maybe it's pure luck if I found this :

    After trying to run a script from the interpreter prompt >>> with the command

        execfile('filename.py')
    

    for which I got a "NameError: name 'execfile' is not defined" I tried a very basic

        import filename
    

    it worked well :-)

    I hope this can be helpful and thank you all for the great hints, examples and all those masterly commented pieces of code that are a great inspiration for newcomers !

    I use Ubuntu 16.014 LTS x64. Python 3.5.2 (default, Nov 17 2016, 17:05:23) [GCC 5.4.0 20160609] on linux

    0 讨论(0)
提交回复
热议问题