Python3 execfile в том, что использует модульный PyC кэш?

Во-первых, поскольку Python3 удалил execfile, необходимо написать, что вы сами, это нормально, однако я бы хотел использовать pyc-кеш для будущих выполнений.

Импорт модуля в Python может автоматически сгенерировать pyc файл, который будет использоваться, чтобы избежать синтаксического анализа файла, когда новый процесс Python должен снова импортировать модуль.

Есть ли способ использовать pyc механизм кэширования, который запускает код напрямую (поэтому он не должен быть в sys.path или добавить себя в sys.modules).

например:

def my_execfile(filepath):
    globals = {'__name__': '__main__', '__file__': filepath}
    locals = {}
    with open(filepath, 'rb') as file:
        exec(compile(file.read(), filepath, 'exec'), globals, locals)

Есть ли способ иметь что-то приближающее эту функцию, которая запускает файл - который создаст / использует pyc когда возможно?

Или мне нужно написать свой pyc проверка кэша, которая обрабатывает детали проверки пути, сравнения меток времени файла, выписывает байт-код... и т. д.

0 ответов

Это можно сделать с помощью importlib, даже если он использует логику импорта, он работает как обычное выполнение файла.

def execfile_cached(filepath, mod=None):
    # module name isn't used or added to 'sys.modules'.
    # passing in 'mod' allows re-execution
    # without having to reload.

    import importlib.util
    mod_spec = importlib.util.spec_from_file_location("__main__", filepath)
    if mod is None:
        mod = importlib.util.module_from_spec(mod_spec)
    mod_spec.loader.exec_module(mod)
    return mod
Другие вопросы по тегам