IPython autoreload changes in subdirectory

后端 未结 3 1976
暗喜
暗喜 2021-01-11 11:26

I launch IPython from the main folder /project. Now if I make changes in the file /project/tests/some_module.py, the changes fail to be autoreloade

相关标签:
3条回答
  • 2021-01-11 11:48

    If all you need is to reload a changed file in Python just do the following:

    from main import some_module
    ....
    reload(some_module)
    

    But if your reload purposes are really eager, you can do the following (taken from this question):

    %load_ext autoreload
    %autoreload 2
    

    The previous code will reload all changed modules every time before executing a new line.

    NOTE: You can also check dreload which does a recursive reload of a module, and %run which allows you to run any python script and load all of its data directly into the interactive namespace.

    Hope it helps,

    0 讨论(0)
  • 2021-01-11 12:01

    Try changing your file use_some_module.py to:

    import some_module
    
    some_module.hello_world()
    

    Reload with from import usually does not work.

    This works for me:

    %autoreload 1
    %aimport use_some_module
    %aimport some_module
    
    0 讨论(0)
  • 2021-01-11 12:08

    Module /project/tests/some_module.py must be importable from /project. It means /project/tests must be in sys.path.

    Either change to /project/tests and %run use_some_module.py or do sys.path.insert(0,tests) to insert tests into module search path.

    If some_module is not in search path, IPython's autoreload never gonna find it.

    Another way to make it work is to make the tests a package by creating __init__.py in it. And use relative import in use_some_module as from .some_module import hello_world. Now do these from IPython prompt,

    In [1]: load_ext autoreload
    
    In [2]: %autoreload 2
    
    In [3]: from tests import some_module
    
    In [4]: run -m tests.use_some_module
    Hello World!!!
    In [5]: ed tests/some_module.py
    "tests/some_module.py" 3L, 69C written
     done. Executing edited code...
    In [6]: run -m tests.use_some_module
    Hello World!!!
    Hello World!!!  
    

    That's you have to run use_some_module module in the tests package as a script.

    The first time you do %run tests/use_some_module.py, which is run as if you were running python tests/use_some_module.py. So /project/tests which the script is in, is automatically included in sys.path. That's why from some_module import hello_world in use_some_module succeeds. Additionally, after the run, objects in use_some_module's global namespace are available in IPython session.

    But when you change tests/some_module, it has to be loaded again to see the changes. To reload it manually, it has to be imported first. Now import should succeed because use_some_module imported it first when it was run, some_module is in sys.modules. But reload to succeed, some_moudle has to be in search path. So, even manual reload would fail let alone autoreload.

    In [2]: #before %run  
    In [3]: 'some_module' in globals()
    Out[3]: False
    
    In [6]: 'some_module' in sys.modules
    Out[6]: False
    
    In [7]: 'hello_world' in globals()
    Out[7]: False
    
    In [8]: run tests/use_some_module.py
    Hello World!!!
    
    In [9]: 'some_module' in globals()
    Out[9]: False
    
    In [11]: 'some_module' in sys.modules
    Out[11]: True
    
    In [12]: 'hello_world' in globals()
    Out[12]: True
    In [13]: import some_module
    
    In [14]: some_module = reload(some_module)
    ---------------------------------------------------------------------------
    ImportError                               Traceback (most recent call last)
    <ipython-input-14-47e3c0de23e1> in <module>()
    ----> 1 some_module = reload(some_module)
    
    ImportError: No module named some_module
    

    Another solution is to start IPython as PYTHONPATH=tests ipython to include tests directory in sys.path.
    Or set this c.InteractiveShellApp.exec_lines = ['import sys','sys.path.insert(0,"tests")'] in ipython_config.py.
    .

    0 讨论(0)
提交回复
热议问题