2015-10-30 1 views
1

У меня есть следующий игрушечный код в двух файлах:В Python REPL, как получить последний код из всего файла?

Файл b.py:

def test_b(): 
    print "b" 

Файл a.py: из б импорта test_b

def test_a(): 
    print "a" 
    test_b() 

Тогда я бегу питона REPL:

>>> execfile("a.py") 
>>> test_a() 
a 
b 

Тогда я изменить b.py в: четкости test_b(): печать "бб"

И работать в REPL:

>>> execfile("b.py") 
>>> test_a() 
a 
bb 

На данный момент это все в порядке. Теперь я могу изменить a.py в:

from b import test_b 

def test_a(): 
    print "aa" 
    test_b() 

Теперь я бегу в РЕПЛ:

>>> execfile("a.py") 
>>> test_a() 
aa 
b 

, который не в порядке, так как больше РЕПЛ получил старую версию b.py. Кажется, что Python делает кеширование при загрузке файлов, и мой вопрос: есть ли способ заставить его не делать этого? Я не смог найти подходящую опцию для функции excefile.

+2

Этот ответ полезен для вашего вопроса? http://stackoverflow.com/a/2918951/758446 – BlackVegetable

+0

@BlackVegetable выглядит так, спасибо. Я собираюсь проверить это сейчас. – S4M

ответ

1

В соответствии с: https://docs.python.org/2/tutorial/modules.html вы можете использовать перезагрузку (a) (она должна быть импортирована один раз раньше). См. Описание, это может быть не лучшее решение.

цитата:

Примечание

соображений эффективности, каждый модуль импортируется только один раз на переводчика сессии. Поэтому, если вы меняете свои модули, вы должны перезапустить интерпретатор - или, если это всего лишь один модуль, который вы хотите протестировать в интерактивном режиме, используйте reload(), например. перезагрузить (имя_модуль).

и описание функции: https://docs.python.org/2/library/functions.html#reload использовать умеренность с:

Если импортирует модуль объекты из другого модуля, используя из ... импорт ..., вызывая перезагрузку() для другой модуль не переопределяет объекты, импортированные из него - одним из способов этого является повторное выполнение оператора from, а другое - использование импортных и квалифицированных имен (модуль name).

Простейшим решением является перезапуск вашего переводчика.