[英]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 :我想要一个解决方案,我不需要更改工作目录,也不需要手动添加任何搜索路径。 我想让它自动加载自动加载。
尝试将文件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_world
在use_some_module
成功。 此外,在运行之后, use_some_module
的全局命名空间中的对象在IPython会话中可用。
但是当你更改tests/some_module
,必须再次加载它才能看到更改。 要手动reload
,必须先导入它。 现在import
应该成功,因为use_some_module
在运行时use_some_module
导入它, some_module
在sys.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.