DeanLa
DeanLa

Reputation: 1919

ipython autoreload doesn't work

autoreload doesn't work for me in subdirs at all.

dir structure:

run.ipynb
oof.py
pertussis/
    |-- __init__.py

on run.ipynb I have (running with notebook):

from pertussis import *
check() #defined in the module

this doesn't work. I tried everything. I added the autoreload magic inside code, inside config file, everywhere. I also added the folder of the module to the sys.path list. Never reloaded. I tried reloading a regular file oof.py from the notebook, instead of the module directly.

on oof.py I have:

from pertussis import *
def check_2():
  print ("Hello")

What happend now is that check_2 was autoreloaded successfully, but check from the module still didn't reload.

Nothing seems to work, I am lost.

Upvotes: 8

Views: 18395

Answers (2)

trozzel
trozzel

Reputation: 638

I don't believe this is an iPython issue, but is due to the nature of from imports.

The following is from Learning Python Oreilly, p798 (5th ed.)

...because from copies (assigns) names when run, there's no link back to the modules where the names came from. Names imported with from simply become references to objects, which happen to have been referenced by the same names in the importee when the from ran.

A workaround is to use import and name qualification. For example:

import pertussis
pertussis.check()

Then in oof.py:

import pertussis # now must use full name qualification
def check_2():
  print ("Hello")

Upvotes: 5

bluu
bluu

Reputation: 552

Sorry for the late response, I've just stumbled upon a similar problem.

In your run.ipynb, have you tried:

import pertussis
pertussis.check()

Or

%load_ext autoreload 
%autoreload 1

then

%aimport pertussis
check = pertussis.check  # optional shortcut
check()

Upvotes: 4

Related Questions