Я получаю неожиданное поведение при попытке запустить методы, определенные в файле, загруженном с использованием модуля runpy . Методы не видят никаких переменных (включая импортированные модули), определенных вне этого метода. Вот как я это делаю:
#test.py
import runpy
env = runpy.run_path('test', {'y':'world'})
env['fn']()
~
#test
import re
print(re.compile(r'^hello', re.IGNORECASE).sub('', "hello world"))
x = "hello"
print(x)
print(y)
def fn():
try:
print(re.compile(r'^hello', re.IGNORECASE).sub('', "hello world"))
except:
print("No re")
try:
print(x)
except:
print("No x")
try:
print(y)
except:
print("No y")
Мой ожидаемый результат test.py будет:
world
hello
world
world
hello
world
потому что fn сформирует замыкание для re, x и y.
Однако вместо этого я получаю:
world
hello
world
No re
None
None
Похоже, что re не определен в fn, хотя это должно быть при обычном поведении закрытия x и y еще более странные, потому что они определены, но имеют значение None.
Почему это так и как закрытия работают с runpy? Как мне добиться нормального поведения, чтобы fn мог «видеть» внешние переменные?