Вопрос

Этот вопрос уже имеет ответ здесь:

Python 2 имел встроенную функцию execfile, который был удален в Python 3.0. Этот вопрос обсуждает альтернативы для Python 3.0, но некоторые значительные изменения были сделаны Поскольку Python 3.0.

Какая лучшая альтернатива для execfile для Python 3.2, и будущие версии Python 3.x?

Это было полезно?

Решение

А 2to3 Скрипт (также тот, который в Python 3.2) заменяет

execfile(filename, globals, locals)

по

exec(compile(open(filename, "rb").read(), filename, 'exec'), globals, locals)

Похоже, это официальная рекомендация.

Другие советы

execfile(filename)

можно заменить на

exec(open(filename).read())

который работает во всех версиях Python

В Python3.x это самое близкое, что я мог бы придумать для выполнения файла напрямую, который соответствует запуску python /path/to/somefile.py.

Заметки:

  • Использует бинарное чтение, чтобы избежать проблем кодировки
  • Garenteed закрыть файл (Python3.x предупреждает об этом)
  • определяет __main__, некоторые сценарии зависят от этого, чтобы проверить, загружаются ли они как модуль или нет, например. if __name__ == "__main__"
  • параметр __file__ лучше для сообщений исключений, и некоторые сценарии используют __file__ Чтобы получить пути других файлов по сравнению с ними.
def exec_full(filepath):
    import os
    global_namespace = {
        "__file__": filepath,
        "__name__": "__main__",
    }
    with open(filepath, 'rb') as file:
        exec(compile(file.read(), filepath, 'exec'), global_namespace)

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

Стандартный runpy.run_path это альтернатива.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top