2016-10-03 5 views
0

У меня есть файл под именем sub.py, и я хочу иметь возможность вызывать в нем функции из оболочки iPython. Однако функциональность автозапуска iPython работает не очень хорошо. Иногда он обнаруживает изменения, иногда это не так.Как выполнить ручную перезагрузку файла в оболочке iPython

Вместо того, чтобы отлаживать автозагрузку, мне было интересно, есть ли способ просто перезагрузить или выгрузить или загрузить модули в iPython. В настоящее время я завершаю оболочку, запускаю ее снова, повторно импортирую свой модуль и оттуда оттуда. Было бы замечательно, если бы вы могли выполнить ручную перезагрузку, не убивая оболочку iPython.

+0

Не отвечает на этот вопрос? http://stackoverflow.com/questions/437589/how-do-i-unload-reload-a-python-module – skovorodkin

+0

Интересно, могут ли ваши проблемы с перезагрузкой ipython из-за зависания файлов .pyc. Попробуйте добавить переменную окружения 'export PYTHONDONTWRITEBYTECODE = 1' и посмотреть, не облегчает ли она вопросы. – wim

ответ

1

Я считаю своей доморощенной %reimport быть очень полезным в этом контексте:

def makemagic(f): 
    name = f.__name__ 
    if name.startswith('magic_'): name = name[6:] 
    def wrapped(throwaway, *pargs, **kwargs): return f(*pargs,**kwargs) 
    if hasattr(f, '__doc__'): wrapped.__doc__ = f.__doc__ 
    get_ipython().define_magic(name, wrapped) 
    return f 

@makemagic 
def magic_reimport(dd): 
    """ 
    The syntax 

     %reimport foo, bar.* 

    is a shortcut for the following: 

     import foo; foo = reload(foo) 
     import bar; bar = reload(bar); from bar import * 
    """ 
    ipython = get_ipython().user_ns 
    for d in dd.replace(',', ' ').split(' '): 
     if len(d): 
      bare = d.endswith('.*') 
      if bare: d = d[:-2] 
      exec('import xx; xx = reload(xx)'.replace('xx', d), ipython) 
      if bare: exec('from xx import *'.replace('xx', d), ipython) 

После Гоча является то, что, когда есть суб-модулей пакетов, участвующих, вы должны reimport суб-модуль, и затем пакет верхнего уровня:

reimport foo.bar, foo 
Смежные вопросы