Перезагрузка измененного файла python в оболочке emacs python - PullRequest
7 голосов
/ 29 ноября 2009

В оболочке emacs Python (я использую 2. * Python) я импортирую файл .py, с которым я работаю, и тестирую код. Однако, если я изменю код, я не уверен, как импортировать его снова.

Из моего прочтения кажется, что

reload(modulename)

должно работать, но не похоже.

Возможно, достаточно просто закрыть оболочку python и перезапустить ее, есть ли для этого команда или вы просто делаете это вручную?

edit: похоже, что python-send-defun и python-send-buffer были бы идеальными, но изменения, похоже, не распространяются.

Ответы [ 3 ]

15 голосов
/ 29 ноября 2009

Хотя reload() работает, оно не изменяет ссылки на классы, функции и другие объекты, поэтому легко увидеть старую версию. Наиболее последовательным решением является замена reload() либо exec (что означает, в первую очередь, не использовать import), либо полный перезапуск интерпретатора.

Если вы хотите продолжать использовать перезагрузку, будьте очень осторожны с ссылками на вещи из этого модуля и всегда используйте полное имя. Например. import module и используйте module.name вместо from module import name. И, даже будучи осторожным, вы все равно столкнетесь с проблемами со старыми объектами, что является одной из причин, по которой reload() отсутствует в 3.x.

5 голосов
/ 29 ноября 2009

Кажется, у меня работает:

Создайте файл (в вашей PYTHONPATH) с именем test.py

def foo():
    print('bar')

Затем в оболочке emacs python (или еще лучше в оболочке ipython) введите

>>> import test
>>> test.foo()
bar

Теперь измените test.py:

def foo():
    print('baz')

>>> reload(test)
<module 'test' from '/home/unutbu/pybin/test.py'>
>>> test.foo()
baz
0 голосов
/ 03 февраля 2018

Изучив эту проблему в течение довольно продолжительного времени, я пришел к выводу, что лучшее решение для реализации - либо на основе файла инициализации вашего интерпретатора Python (ipython для примера), либо с помощью сборки Python -в модуле «имп» и его функции «перезагрузка». Например, в начале вашего кода:

import my_module
import imp
imp.reload(my_module)

#your code

Это решение пришло ко мне с этой страницы: https://emacs.stackexchange.com/questions/13476/how-to-force-a-python-shell-to-re-import-modules-when-running-a-buffer

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...