1

我倾向于在 Jupyter 笔记本和 Wing IDE 之间来回切换以调试代码。我喜欢 Jupyter 笔记本的地方在于,我可以运行一个单元并生成一系列图像,代码如下:

import matplotlib.pyplot as plt
for i in range(10):
    ...do stuff...
    plt.plot(image)
    plt.show()

所有图像都在 jupyter 单元输出区域中一个接一个地很好地结束,并且可以通过滚动该区域轻松查看。

虽然我经常想进入调试器来编写新代码或调试某些东西,但我还没有找到一个很好的机制来做类似的事情。

有什么建议可以解决这个问题吗?

一种选择是编写一个函数,将所有图像写入磁盘,然后使用照片查看应用程序查看这些图像,但我想知道是否有另一种方法。

4

2 回答 2

0

我想出了一个很好的方法来做到这一点:

  • 使用非交互式后端来避免弹出图像
  • 用自己的函数 my_plt_show() 替换所有对 plt.show() 的调用,其中:

    • 调用 plt.show()
    • 将每个无花果保存到临时目录,确保关闭无花果。
    • 在将显示图像的临时目录中写入文件“all.html”。这是要编写的 all.html:

    <html> <img src="img_0000.jpg" /> <br /> <img src="img_0001.jpg" /> <br /> <img src="img_0002.jpg" /> <br /> <img src="img_0003.jpg" /> <br />

  • 在运行或调试后,只需在浏览器中打开 all.html 文件,它的行为几乎就像 jupyter 单元的输出一样。

这是我的示例代码:

I_AM_IN_JUPYTER = False
SCRATCH_IMAGE_DIR = 'C:\\Work\\ScratchImages'
SCRATCH_IMAGE_NUM = 0

if I_AM_IN_JUPYTER:
    get_ipython().magic('matplotlib inline')
else:
    # use non-interactive back-end to avoid images from popping up
    # See: http://stackoverflow.com/questions/9622163/save-plot-to-image-file-instead-of-displaying-it-using-matplotlib-so-it-can-be
    from matplotlib import use
    use('Agg') 

# function to show a plot or write it to disk
def my_plt_show():
    global I_AM_IN_JUPYTER, SCRATCH_IMAGE_NUM, f_html
    plt.show()
    if I_AM_IN_JUPYTER == False:
        # at start
        if SCRATCH_IMAGE_NUM == 0:
            # clean out the scratch image dir
            files = glob.glob(SCRATCH_IMAGE_DIR+'\\*')
            for f in files:
                os.remove(f)  
            # open 'all.html' that displays all the images written
            f_html = open(SCRATCH_IMAGE_DIR+'\\all.html', 'w')
            f_html.write('<html>\n')

        # save all images to a scratch dir
        fname = 'img_{:04d}.jpg'.format(SCRATCH_IMAGE_NUM)
        plt.savefig(SCRATCH_IMAGE_DIR+'\\'+fname)
        fig = plt.gcf() # get reference to the current figure
        plt.close(fig)  # and close it
        f_html.write('<img src="'+fname+'" /> <br />\n') 
        f_html.flush() # flush it directly to disk, for debug purposes.        
        SCRATCH_IMAGE_NUM += 1    
于 2017-04-22T02:56:05.060 回答
0

可能要做的事情是使用wingdbstub,这样您就可以在Jupyter 的上下文中进行调试。这在http://wingware.com/doc/howtos/jupyter有详细描述——限制是你不能调试 .ipynb 文件中的代码,但你可以把大部分东西放到 .py 文件中。

于 2017-04-22T01:54:33.110 回答