Я пытаюсь загрузить функции из сценария динамически, когда я внутри интерактивной оболочки ipython. Например, предположим, что у меня есть питон скрипт вроде этого:Функции, определенные в динамически загружаемых скриптах, не могут ссылаться друг на друга
# script.py
import IPython as ip
def Reload():
execfile('routines.py', {}, globals())
if __name__ == "__main__":
ip.embed()
Предположим, файл routines.py как это:
# routines.py
def f():
print 'help me please.'
def g():
f()
Теперь, если я бегу script.py сценарий, я буду входа в интерактивную оболочку. Если я печатаю следующее, мой вызов г() работает:
execfile('routines.py')
g()
Однако, если я печатаю следующее, вызов г() не:
Reload()
g()
Я получаю сообщение об ошибке говоря, что «глобальное имя f не определено»., хотя я все еще могу видеть, что f и g находятся на выходе, когда я ввожу globals() в интерактивную оболочку.
В чем разница этих двух?
UPDATE:
следующие работы, однако это не является предпочтительным решением, так что я хотел бы иметь лучшее решение вышеуказанной проблемы.
Если изменить script.py на:
# script.py
import IPython as ip
def Reload():
execfile('routines.py')
if __name__ == "__main__":
ip.embed()
И изменить routines.py на:
# routines.py
global f
global g
def f():
print 'help me please.'
def g():
f()
Тогда, если я позвоню Reload() в интерактивной оболочке, а затем вызвать г() , оно работает. Однако это не предпочтительный подход, потому что я должен объявлять глобальные имена.
UPDATE 2:
кажется, что проблема не зависит от IPython. С первой версией routines.py если я запустить оболочку Python, и введите следующую команду вручную:
def Reload():
execfile('routines.py', {}, globals())
g()
призыв к г() также терпит неудачу. Но следующие работы:
execfile('routines.py')
g()
Почему вы используете 'execfile'? Просто импортируйте модуль: 'from routines import *'. – Bakuriu
Извините, почему-то я не могу этого сделать. Я также ошибся в описании проблемы, и теперь я ее обновил. Спасибо! – shaoyl85