IPython与加载python setup.py开发模块不一致?

时间:2013-12-05 04:24:39

标签: python ipython

我有一个名为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>

所以这似乎已经解决了......现在。

1 个答案:

答案 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明确询问的模块。