问题描述
我正在通过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
模块中,然后从那里导入和使用东西。