首页 > 解决方案 > 关于 Jupyter 中 Python 解释器的“非线性”行为的问题

问题描述

我正在通过 ssh 在 linux 机器上远程运行以下代码,并在与通过浏览器访问的 Jupyter notebook 相同的 linux 机器上运行以下代码。

import cv2
import pdf2image

def minimalFun(pdf_filepath, make_me_suffer = False):
    print("Now I start.")
    images = pdf2image.convert_from_path(pdf_filepath)
    print("Pdf read.")
    
    if make_me_suffer:
        cv2.namedWindow('test',0)
        
    print("I finished!")
    
minimalFun('Test.pdf', make_me_suffer = True)

我对 Jupyter 中 Pyhton 解释器的行为差异以及在命令行上使用时的行为感到困惑。

在 Jupyter 笔记本中

通过make_me_suffer = False设置,代码将只打印

Now I start.
Pdf read.
I finished!

特别意味着该功能pdf2image.convert_from_path成功运行。但是,make_me_suffer设置为True时,代码将仅打印

Now I start.

然后报告内核已经死了,将重新启动。特别是,内核已经与 function 一起死掉了pdf2image.convert_from_path

在命令行上

正如预期的那样,通过make_me_suffer = False设置代码将只打印

Now I start.
Pdf read.
I finished!

但是现在当标志设置为 时make_me_suffer = True,我们得到

Now I start.
Pdf read.
: cannot connect to X server

意味着这里的功能pdf2image.convert_from_path再次成功完成。

问题:

Jupyter 解释器是否“向前看”以查看稍后是否会有命令要求 x 窗口系统并根据信息更改当前内容的解释。如果是这样,为什么?这很常见吗?从其他文件加载的函数是否会发生这种情况?到底是怎么回事?

我问的原因是,这花了我很多时间来解决和查明更复杂的功能。这让我很担心,因为我不知道将来如何避免这种情况,除了从现在开始在任何图形上都有一个恐惧症。

标签: pythonjupyter-notebookpython-internalspythoninterpreter

解决方案


Jupyter 解释器是否“向前看”以查看稍后是否会有命令要求 x 窗口系统并根据信息更改当前内容的解释。

不,不是的。

如您所知,您可以按任意顺序运行单元格,也可以在运行一次后对其进行修改。除非使用得当,否则这会使笔记本非常脆弱。

但是,您可以将通用代码(例如,初始化您知道需要的窗口的内容)移动到.py笔记本目录中的常规模块中,然后从那里导入和使用内容。


推荐阅读