Ответ 1

2to3 script (также тот, что находится в Python 3.2) заменяет

execfile(filename, globals, locals)

по

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

Это, по-видимому, официальная рекомендация.

Ответ 2

execfile(filename)

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

exec(open(filename).read())

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

Ответ 3

В 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")

Ответ 4

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