JupyterLab 中的内核在使用 sys 模块时不断死亡

Kernel in JupyterLab keeps dying when using sys module

我最近开始编码,想在参加了 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 的内核在我输入数字的那一刻就一直死在我身上。

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

谁能告诉我我做错了什么?

我认为生成一个新的 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

但是如果您真的需要重新启动内核,您应该使用 的解决方案之一(或等效于您可能正在使用的任何其他内核)。