我有一个名为dataviz
的模块,我使用python setup.py develop
安装,位于:
In [4]: dataviz.__file__
Out[4]: '/home/obot/gscripts/gscripts/general/dataviz.py'
但我在此文件中收到错误:/nas3/yeolab/Software/Python-2.7.5/lib/python2.7/site-packages/gscripts-0.1.4-py2.7.egg/gscripts/general/dataviz.pyc
,在heatmap
函数中,在此行:
--> 321 heatmap_ax.yaxis.set_ticks_position('center')
但当我dataviz.heatmap??
时,它指向/home/obot/gscripts/gscripts/general/dataviz.py
并且相应的行是:
heatmap_ax.yaxis.set_ticks_position('left')
你知道发生了什么吗?
编辑:
我添加了%load_ext autoreload
,这似乎已修复并正确重新加载。此模块也没有dreload
正确,它崩溃然后我必须重新启动我的内核,这完全是首先运行dreload
,所以我可以保留所有变量= \ < / p>
所以这似乎已经解决了......现在。
答案 0 :(得分:1)
就进口而言,setup.py develop
没有什么特别之处。它只是将源位置添加到sys.path
,而不是将文件复制到site-packages
。
您看到的不一致是由于如何显示追溯。 Python在导入时不会将整个文件内容存储在内存中。但是,它存储的代码的编译版本包括诸如文件名和行号的引用之类的内容。 Python使用这些信息来构建回溯之类的东西,而IPython也将它用于检查,例如object??
输出。
从文件foo.py
开始:
def bar(a):
return 1/a
我们可以将其导入IPython:
In [1]: import foo
In [2]: foo.bar(1)
Out[2]: 1
In [3]: foo.bar(0)
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<ipython-input-3-1db308259005> in <module>()
----> 1 foo.bar(0)
/Users/minrk/dev/ip/nbviewer/foo.py in bar(a)
1 def bar(a):
----> 2 return 1/a
3
ZeroDivisionError: integer division or modulo by zero
通过查找文件并从编译对象中读取行号信息来构建回溯:
In [4]: foo.__file__
Out[4]: 'foo.py'
In [5]: foo.bar.__code__.co_firstlineno
Out[5]: 1
如果我们更改磁盘上的文件,它不会更改内存中的行号引用,因为模块尚未重新加载。 例如,让我们添加一个docstring:
def bar(a):
"""This docstring definitely doesn't raise ZeroDivisionError"""
return 1/a
现在我们可以再次进行相同的调用,但是回溯将找到异常 的同一行,而不是它在新文件中的位置:
In [6]: foo.bar(0)
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<ipython-input-6-1db308259005> in <module>()
----> 1 foo.bar(0)
/Users/minrk/dev/ip/nbviewer/foo.py in bar(a)
1 def bar(a):
----> 2 """This docstring definitely doesn't raise ZeroDivisionError"""
3 return 1/a
ZeroDivisionError: integer division or modulo by zero
但是如果我们重新加载文件,内存中的表示将与文件同步:
In [7]: reload(foo)
Out[7]: <module 'foo' from 'foo.py'>
In [8]: foo.bar(0)
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<ipython-input-8-1db308259005> in <module>()
----> 1 foo.bar(0)
/Users/minrk/dev/ip/nbviewer/foo.py in bar(a)
1 def bar(a):
2 """This docstring definitely doesn't raise ZeroDivisionError"""
----> 3 return 1/a
ZeroDivisionError: integer division or modulo by zero
我发现您已找到dreload
和%autoreload
。我无法帮助“它崩溃”,但通常一个简单的显式reload
比dreload更简单,更可靠,尤其是在使用单个文件时。但你可能会尝试这种稍微保守的方法:
In [12]: %load_ext autoreload
In [13]: %autoreload 1
In [14]: %aimport foo
只应自动重新加载您已使用%aimport
明确询问的模块。