【问题标题】:Kernel in JupyterLab keeps dying when using sys module使用 sys 模块时,JupyterLab 中的内核一直死机
【发布时间】:2021-08-12 00:18:23
【问题描述】:

我最近开始编写代码,并想在 10 小时的 Udemy 课程后在初学者程序中试试运气。

我编写了一个“猜数字”小游戏,其中会生成一个介于 1-10 之间的数字,如果有人猜错,我希望程序重新启动。

import random
import os
import sys

def restart_program():
    python = sys.executable
    os.execv(sys.executable, ['python'] + sys.argv)

number = str(random.randrange(1,10))

choice = input("Which number did the PC pick?\n")

if choice == number:
    print("You won!")
    restart_program()
elif choice != number:
    print("You lose!")
    restart_program()

由于某种原因,当我输入一个数字时,JupyterLab 的内核一直在死机。

我尝试过重构代码并使用完全不同的代码,但我总是杀死内核。

如果我做错了,谁能告诉我?

【问题讨论】:

  • 嗨,欢迎来到 SO。你能澄清一下,死在你身上到底是什么意思?您收到的具体错误信息是什么?
  • 嘿,所以我收到的错误消息是:“PATH 的内核似乎已经死了。它将自动重新启动。”

标签: python jupyter-lab


【解决方案1】:

我认为生成一个新的 Python 解释器作为“重新启动”程序的手段并不是一个好主意,尤其是如果你不是它的所有者(你是不是一开始就生成了程序?不,Jupyter 内核做到了)对你来说→你不应该像os.execv那样试图杀死它并用另一个进程替换)。

此外,根据sys.argv 中的内容,您实际上可能会调用不同的模块,这也可能导致崩溃。亲眼看看 - 当运行带有 IPython 内核的笔记本时 sys.argv 包含 IPython 内部命令,你不应该玩这些!

对于这个简单的初学者程序,您可能应该使用循环:

import random

done = False

while not done:
    number = str(random.randrange(1,10))
    choice = input("Which number did the PC pick?\n")

    if choice == number:
        print("You won!")
    elif choice != number:
        print("You lose!")

    if choice == 'x':
        done = True

但是,如果您确实需要重新启动内核,您应该使用restarting IPython kernel from code cell 的解决方案之一(或您可能正在使用的任何其他内核的等效解决方案)。

【讨论】:

  • 非常感谢。有效。老实说,我忘记了循环是一件事,不知道为什么我想以艰难的方式去做。
猜你喜欢
  • 2023-03-04
  • 2022-01-07
  • 2019-08-01
  • 2017-06-17
  • 2016-07-13
  • 2018-03-04
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多