我已经使用Jupyter Notebook有一段时间了。经常情况下,当我尝试停止单元格的执行时,中断内核并不起作用。在这种情况下,除了关闭笔记本并重新启动之外,我还能做什么呢?我想这可能是许多人常遇到的情况。
我已经使用Jupyter Notebook有一段时间了。经常情况下,当我尝试停止单元格的执行时,中断内核并不起作用。在这种情况下,除了关闭笔记本并重新启动之外,我还能做什么呢?我想这可能是许多人常遇到的情况。
目前这是github jupyter仓库中的一个问题, https://github.com/ipython/ipython/issues/3400 除了杀死内核似乎没有确切的解决方案。
如果您不介意失去当前定义的所有变量,那么转到Kernel> Restart将停止执行而不关闭笔记本。
以下是几个选项:
更改数据文件夹名称: 如果单元格已经在运行并从特定文件夹中提取数据,则可以使用此方法。例如,我有一个for循环,当中断时就会移到正在处理的列表中的下一项。
更改单元格中的代码以生成错误: 如果该单元格尚未运行但只是在队列中,则可以使用此方法。
重启内核: 如果所有其他方法都失败了。
最近我也遇到了类似的问题。
发现在Python中存在一个问题,https://github.com/ipython/ipython/issues/3400,而且已经存在了六年之久,但是截至2020年3月1日它已被解决。
有一种可能有效的方法是多次按中断键。可能你正在使用的某个库会捕获中断信号,并在接收到多次信号后停止。
例如,当使用 sklearn 的 cross_val_score() 时,我发现每个交叉验证折叠都需要按一次中断键。
如果您事先知道可能需要停止而不丢失所有变量,则以下解决方案可能很有用:
对于因长时间循环而花费时间的单元格,您可以在循环中实现以下内容:
if os.path.exists(os.path.join(os.getcwd(),'stop_true.txt')):
break
如果你想停止循环,只需创建文件“stop_true.txt”。下一轮循环之前,循环将停止。
通常,该文件称为“stop_false.txt”,直到我将其重命名以停止循环。
此外,每个循环的结果都会单独存储在一个字典中。因此,我能够保留所有结果,直到发生中断,并可以从此点重新启动循环。
尝试以下操作:
jupyter server list
jupyter server stop <PORT>
命令停止每个正在运行的服务器sudo python -m pip install pyrasite
或python3
(根据需要)。然后,需要找出iPython内核的进程ID(PID)(例如通过htop
或ps aux | grep ipython
),比如说是3873。接着,编写一个脚本来将状态保存为例如pickle文件中的inject.py,例如全局范围内的Pandas dataframe df
。df.to_pickle("rescued_df.pkl")
sudo pyrasite 3873 inject.py
您可能需要先启用dtrace,方法如下:
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope