有关Jupyter中Python解释器的“非线性”行为的问题

问题描述

我正在通过ssh在linux计算机上远程运行以下代码,并且与通过浏览器访问的Jupyter笔记本在同一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.

,然后报告内核已死亡并且将重新启动。特别是,内核已经死于功能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窗口系统并根据该信息更改当前内容的解释。如果是这样,为什么?这很常见吗?从其他文件加载的函数会发生这种情况吗?发生了什么事?

我要问的原因是,这花了我很多时间来排查并查明更复杂的功能。这使我感到困惑,因为我不知道将来如何避免这种情况,除了从现在开始在任何图形上都存在偏见。

解决方法

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

不,不是。

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...