Альтернатива execfile в Python 3? [дублировать
-
28-10-2019 - |
Вопрос
Этот вопрос уже имеет ответ здесь:
- Что такое альтернатива execfile в Python 3? 11 ответов
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 это альтернатива.
Не связан с StackOverflow