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

2024-09-30 22:20:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名为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的第一点,这样我就可以保持我所有的变量=\

所以这似乎解决了问题。。现在。你知道吗


Tags: 模块pyhomesetuppositionaxgeneralset
1条回答
网友
1楼 · 发布于 2024-09-30 22:20:36

就进口而言,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。我忍不住要说“it crasks”,但通常一个简单的显式reload比dreload简单得多,也更可靠,尤其是在处理单个文件时。但你可以尝试这种稍微保守一点的方法:

In [12]: %load_ext autoreload

In [13]: %autoreload 1

In [14]: %aimport foo

它只会自动重新加载您显式要求它使用%aimport加载的模块。你知道吗

相关问题 更多 >