diff --git a/spyder/plugins/ipythonconsole/tests/test_ipythonconsole.py b/spyder/plugins/ipythonconsole/tests/test_ipythonconsole.py
index 08f9e1f749a..de62590f99a 100644
--- a/spyder/plugins/ipythonconsole/tests/test_ipythonconsole.py
+++ b/spyder/plugins/ipythonconsole/tests/test_ipythonconsole.py
@@ -13,6 +13,7 @@
# Standard library imports
import os
import os.path as osp
+import re
import shutil
import sys
from textwrap import dedent
@@ -40,8 +41,6 @@
from spyder.plugins.ipythonconsole.tests.conftest import (
get_conda_test_env, get_console_background_color, get_console_font_color,
NEW_DIR, SHELL_TIMEOUT, TEMP_DIRECTORY)
-from spyder.plugins.ipythonconsole.utils.kernel_handler import (
- KernelConnectionState)
from spyder.plugins.ipythonconsole.widgets import ShellWidget
from spyder.utils.conda import get_list_conda_envs
@@ -1355,30 +1354,57 @@ def test_conda_env_activation(ipyconsole, qtbot):
@flaky(max_runs=3)
+@pytest.mark.parametrize("external_interpreter", [True, False])
@pytest.mark.skipif(os.name == 'nt', reason="no SIGTERM on Windows")
-def test_kernel_kill(ipyconsole, qtbot):
+def test_kernel_kill(ipyconsole, qtbot, external_interpreter):
"""
Test that the kernel correctly restarts after a kill.
"""
+ if external_interpreter:
+ if running_in_ci():
+ ipyconsole.set_conf('default', False, section='main_interpreter')
+ pyexec = get_conda_test_env()[1]
+ ipyconsole.set_conf(
+ 'executable', pyexec, section='main_interpreter'
+ )
+ ipyconsole.create_new_client()
+ else:
+ # We can't check this locally
+ return
+
shell = ipyconsole.get_current_shellwidget()
+
# Wait for the restarter to start
qtbot.wait(3000)
crash_string = 'import os, signal; os.kill(os.getpid(), signal.SIGTERM)'
+
# Check only one comm is open
old_open_comms = list(shell.kernel_handler.kernel_comm._comms.keys())
assert len(old_open_comms) == 1
with qtbot.waitSignal(shell.sig_prompt_ready, timeout=30000):
shell.execute(crash_string)
- assert crash_string in shell._control.toPlainText()
- assert "Restarting kernel..." in shell._control.toPlainText()
+
+ console_text = shell._control.toPlainText()
+ assert crash_string in console_text
+ assert "The kernel died, restarting..." in console_text
+
+ # Check we don't show error generated by `conda run`
+ assert "conda.cli.main_run" not in console_text
+
+ # Check IPython version is shown as expected
+ assert list(re.finditer(r"IPython \d+\.", console_text))
+
# Check a new comm replaced the old one
new_open_comms = list(shell.kernel_handler.kernel_comm._comms.keys())
assert len(new_open_comms) == 1
assert old_open_comms[0] != new_open_comms[0]
+
# Wait until the comm replies
qtbot.waitUntil(
lambda: shell.kernel_handler.kernel_comm._comms[new_open_comms[0]][
- 'status'] == 'ready')
+ 'status'] == 'ready'
+ )
+
assert shell.kernel_handler.kernel_comm._comms[new_open_comms[0]][
'status'] == 'ready'
diff --git a/spyder/plugins/ipythonconsole/utils/kernelspec.py b/spyder/plugins/ipythonconsole/utils/kernelspec.py
index 417025621b0..9d14fd3f4fa 100644
--- a/spyder/plugins/ipythonconsole/utils/kernelspec.py
+++ b/spyder/plugins/ipythonconsole/utils/kernelspec.py
@@ -25,8 +25,7 @@
from spyder.plugins.ipythonconsole import (
SPYDER_KERNELS_CONDA, SPYDER_KERNELS_PIP, SPYDER_KERNELS_VERSION,
SpyderKernelError)
-from spyder.utils.conda import (add_quotes, get_conda_env_path, is_conda_env,
- find_conda)
+from spyder.utils.conda import get_conda_env_path, is_conda_env, find_conda
from spyder.utils.environ import clean_env, get_user_environment_variables
from spyder.utils.misc import get_python_executable
from spyder.utils.programs import (
diff --git a/spyder/plugins/ipythonconsole/widgets/client.py b/spyder/plugins/ipythonconsole/widgets/client.py
index 05dfd184bc3..31bdf35c794 100644
--- a/spyder/plugins/ipythonconsole/widgets/client.py
+++ b/spyder/plugins/ipythonconsole/widgets/client.py
@@ -412,10 +412,6 @@ def connect_shellwidget_signals(self):
self.shellwidget.executed.connect(
self.sig_execution_state_changed)
- # To show kernel restarted/died messages
- self.shellwidget.sig_kernel_restarted_message.connect(
- self.kernel_restarted_message)
-
# To correctly change Matplotlib backend interactively
self.shellwidget.executing.connect(
self.shellwidget.change_mpl_backend)
@@ -509,7 +505,10 @@ def is_benign_error(self, error):
"Note: Debugging will proceed. "
"Set PYDEVD_DISABLE_FILE_VALIDATION=1 to disable this validation.",
# Argument not expected error. See spyder-ide/spyder#19298
- "The following argument was not expected"
+ "The following argument was not expected",
+ # Avoid showing error for kernel restarts after kernel dies when
+ # using an external interpreter
+ "conda.cli.main_run"
]
return any([err in error for err in benign_errors])
@@ -614,18 +613,11 @@ def replace_kernel(self, kernel_handler, shutdown_kernel):
# Reset shellwidget and print restart message
self.shellwidget.reset(clear=True)
- self.shellwidget.print_restart_message()
+ self.shellwidget._kernel_restarted_message(died=False)
def print_fault(self, fault):
"""Print fault text."""
- self.shellwidget._append_plain_text(
- '\n' + fault, before_prompt=True)
-
- @Slot(str)
- def kernel_restarted_message(self, msg):
- """Show kernel restarted/died messages."""
- self.shellwidget._append_html("
%s