Старый код все еще выполняется в ipython после изменения файлов - PullRequest
4 голосов
/ 14 сентября 2011

В file1.py:

def foo():
    import file2
    print "I'm the old file1.py"
    file2.bar()

if __name__ == '__main__':
    foo()

В файле2.py

print "I'm the old file2.py"

def bar():
    print "I'm in the old file2.bar()"

В строке 5 интерактивного сеанса ниже, после внесения изменений в file1.py и file2.py, изменяющих все три вхождения слова old на new, код new в file2.py все еще не используемый.

wim@wim-ubuntu:~/sandpit$ ipython
>>> run file1.py
I'm the old file2.py
I'm the old file1.py
I'm in the old file2.bar()
>>> !rm file2.pyc 
>>> # modify file1, file2
>>> run file1.py
I'm the new file1.py
I'm in the old file2.bar()

Откуда он получает старый код из file2.py?

Я должен что-то неправильно понять, потому что подумал (из справки ipython по run):

Файл выполняется в пространстве имен, изначально состоящем только из __name__ == '__main__' и sys.argv построены, как указано. Это таким образом видит свою среду так, как будто она запускается как отдельная программа

Я удалил файл .pyc и по команде whos вижу, что в пространстве имен нет модуля file2. Но почему импорт не выполняется снова при повторном запуске file1?

1 Ответ

3 голосов
/ 14 сентября 2011

run не запускает новый процесс Python, а выполняет ваш код в текущем - не в текущем пространстве имен, а в текущем процессе Python, поясняется в примечании к документации.Из-за этого sys.modules все еще присутствует и используется старый кешированный модуль.(Вы знакомы с тем, как Python кэширует импортированные модули в обычном режиме?)

Чтобы исправить это, каждый раз запускайте новый процесс Python.reload более чем проблематично и может привести к головным болям, которые, на мой взгляд, не стоят этого.

...