У меня есть скрипт Python runme.py, который я пытаюсь выполнить из callerX.py ниже. Я использую exec(open(filename).read()) для выполнения этой задачи. Выполняемый скрипт содержит простой класс, который пытается вызвать функцию time() как из глобального пространства имен, так и внутри функции.
Во всех приведенных ниже примерах мы выполняем следующий файл с помощью exec():
# runme.py
# this code is being exec()'d by the stand-alone examples 1-3 below:
from time import *
class MyClass():
def main(self):
print("Local tracepoint 1")
t = time()
print("Local tracepoint 2")
mc = MyClass()
print("Tracepoint 1")
gt = time()
print("Tracepoint 2")
mc.main()
print("Tracepoint 3")
caller1.py: (это работает правильно, функция «время» может использоваться в MyClass.main())
print("Run from main scope:")
exec(open("runme.py").read())
caller2.py: (это не работает, происходит сбой с исключением «NameError: global name 'время' не определено" внутри MyClass.main())
def Run():
exec(open("runme.py").read())
print("Run from function:")
Run()
caller3.py: (это работает правильно, оба exec() выполняются без исключений)
def Run():
exec(open("runme.py").read())
print("Run from main scope:")
exec(open("runme.py").read())
print("Run from function:")
Run()
Обратите внимание, что в приведенных выше примерах вызовы функции time() в глобальном пространстве имен runme.py всегда работают, а вызовы функции time() из MyClass.main() работают только иногда, в зависимости от того, или нет, файл runme.py был выполнен exec() из функции.
Если мы вызываем exec() извне функции (caller1.py), она работает. Если мы вызовем exec() из функции (caller2.py), она завершится ошибкой с исключением. Если мы вызываем exec() извне функции, а затем изнутри функции (caller3.py), оба вызовы exec() выполняются без исключения.
Такое поведение кажется непоследовательным. Любые идеи? Я знаю, что это надуманный пример, однако он был взят из гораздо более сложной программы, требования к которой привели нас к этой ситуации.