繁体   English   中英

IPython自动加载子目录中的更改

[英]IPython autoreload changes in subdirectory

我从主文件夹/project启动IPython。 现在,如果我在文件/project/tests/some_module.py进行更改,则更改将无法在IPython中自动/project/tests/some_module.py 另外,在保存更改并希望在提示符中运行其他脚本后,我收到以下消息:

[autoreload of some_module failed: Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/IPython/extensions/autoreload.py", line 229, in check
    superreload(m, reload, self.old_objects)
ImportError: No module named some_module]

它似乎检测到文件夹/tests内部的更改,但它无法导入它。 有人可以帮我弄这个吗?

编辑:为了更好地说明:我从主文件夹中的终端启动IPython。 在这个文件夹中,我有另一个文件夹tests 内部tests我有两个python文件:

some_module.py

def hello_world():
  print "Hello World!!!"

use_some_module.py

from some_module import hello_world

hello_world()

一旦我启动IPython, some_module.py中的进一步更改将不会在IPython中加载。 例如,如果我添加第二个print "Hello Earth!!!" hello_world()的定义中,运行run tests/use_some_module.py ,我得到上面显示的错误信息,只会得到"Hello World!!!" 打印。

Edit2 :我想要一个解决方案,我不需要更改工作目录,也不需要手动添加任何搜索路径。 我想让它自动加载自动加载。

如果您只需要在Python中重新加载已更改的文件,请执行以下操作:

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

但如果您的重新加载目的非常迫切,您可以执行以下操作(取自此问题 ):

%load_ext autoreload
%autoreload 2

之前的代码将在执行新行之前每次重新加载所有已更改的模块。

注意:您还可以检查执行模块递归重载的dreload ,以及允许您运行任何python脚本并将其所有数据直接加载到交互式命名空间的%run

希望能帮助到你,

尝试将文件use_some_module.py更改为:

import some_module

some_module.hello_world()

from import重新加载通常不起作用。

这对我有用:

%autoreload 1
%aimport use_some_module
%aimport some_module

模块/project/tests/some_module.py必须可从/project导入。 这意味着/project/tests必须在sys.path

更改为/project/tests%run use_some_module.py或执行sys.path.insert(0,tests)以将tests插入模块搜索路径。

如果some_module不在搜索路径中,则IPython的autoreload永远不会找到它。

另一种使其工作的方法是通过在其中创建__init__.py来使tests成为一个包。 并使用use_some_module相对导入,如from .some_module import hello_world 现在从IPython提示做这些,

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!!!  

那就是你必须在tests包中运行use_some_module模块作为脚本。

第一次执行%run tests/use_some_module.py ,它就像运行python tests/use_some_module.py运行。 所以脚本所在的/project/tests会自动包含在sys.path 这就是为什么from some_module import hello_worlduse_some_module成功。 此外,在运行之后, use_some_module的全局命名空间中的对象在IPython会话中可用。

但是当你更改tests/some_module ,必须再次加载它才能看到更改。 要手动reload ,必须先导入它。 现在import应该成功,因为use_some_module在运行时use_some_module导入它, some_modulesys.modules reload成功, some_moudle必须处于搜索路径。 所以,即便是手动reload会失败更不用说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

另一个解决方案是启动IPython,因为PYTHONPATH=tests ipython以包含sys.path tests目录。
或设置该c.InteractiveShellApp.exec_lines = ['import sys','sys.path.insert(0,"tests")']ipython_config.py

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM