Хотя exec(open("filename").read()) часто приводится как альтернатива execfile("filename"), в нем упускаются важные детали, которые execfile поддерживались.
Следующая функция для Python3.x максимально приближена к тому, чтобы иметь то же поведение, что и при непосредственном запуске файла. Это соответствует running python /path/to/somefile.py.
# Execute the file. execfile("/path/to/somefile.py")
Примечания:
Использует чтение двоичного файла, чтобы избежать проблем с кодировкой.
Гарантированно закрывает файл (Python3.x предупреждает об этом).
Определяет __main__, некоторые скрипты зависят от этого, чтобы проверить, загружаются ли они как модуль или нет, например. if __name__ == "__main__".
Настройка __file__ удобнее для сообщений об исключениях, и некоторые скрипты используют __file__ для получения путей к другим файлам относительно них.
Принимает необязательные аргументы globals & locals, изменяя их на месте, как это делает execfile - так что вы можете получить доступ к любым переменным, определенным путем обратного чтения переменных после запуска.
В отличие от Python2, execfile это не изменяет текущее пространство имен по умолчанию. Для этого вам нужно явно передать globals() & locals().
run_path всегда создается новое пространство имен. Он выполняет код как модуль, поэтому нет разницы между глобальными и локальными значениями (вот почему есть только init_globals аргумент). Возвращаются глобальные значения.
execfile выполняется в текущем пространстве имен или в заданном пространстве имен. Семантика locals и globals, если она задана, были аналогичны локальным и глобальным значениям внутри определения класса.
run_path может выполнять не только файлы, но также "яйца" и каталоги (подробнее см. в документации).