Repository: spyder-ide/spyder

Issue:
TypeError: runfile() got an unexpected keyword argument 'current_namespace' when trying to debug
<!--- **PLEASE READ:** When submitting here, please ensure you've completed the following checklist and checked the boxes to confirm. Issue reports without it may be closed. Thanks! --->

### Issue Report Checklist

* [x] Searched the [issues page](https://github.com/spyder-ide/spyder/issues?q=is%3Aissue) for similar reports
* [x] Read the relevant sections of the [Spyder Troubleshooting Guide](https://github.com/spyder-ide/spyder/wiki/Troubleshooting-Guide-and-FAQ) and followed its advice
* [x] Reproduced the issue after updating with ``conda update spyder`` (or ``pip``, if not using Anaconda)
* [ ] Could not reproduce inside ``jupyter qtconsole`` (if console-related)
* [x] Tried basic troubleshooting (if a bug/error)
    * [x] Restarted Spyder
    * [x] Reset preferences with ``spyder --reset``
    * [ ] Reinstalled the latest version of [Anaconda](https://www.anaconda.com/download/)
    * [x] Tried the other applicable steps from the Troubleshooting Guide
* [x] Completed the **Problem Description**, **Steps to Reproduce** and **Version** sections below


## Problem Description



### What steps reproduce the problem?

1. I created a new environment using Anaconda Navigator and the python package installed was 3.7.10
2. Launch Spyder from Anaconda Navigator
3. I open any test  file (.py) to debug it and pressing the debug button (ctlr + F5) does not start debugging and  a TypeError: is reflected

### What is the expected output? What do you see instead?
When starting debugging, it is assumed that you should start debugging from the first line, however the typo error is generated


### Paste Traceback/Error Below (if applicable)


```python-traceback

Traceback (most recent call last):

  File "C:\Users\DANIEL~1\AppData\Local\Temp/ipykernel_14940/339229525.py", line 1, in <module>
    debugfile('C:/Users/Daniel Rueda/Jupyter Notebooks/Tesis Rueda Christian/Programa/HydroThermPS-master-V.1.07/runme.py', wdir='C:/Users/Daniel Rueda/Jupyter Notebooks/Tesis Rueda Christian/Programa/HydroThermPS-master-V.1.07')

  File "C:\Users\Daniel Rueda\.conda\envs\HydroThermPS\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 605, in debugfile
    args, wdir, current_namespace))

  File "C:\Users\Daniel Rueda\.conda\envs\HydroThermPS\lib\site-packages\spyder_kernels\customize\spyderpdb.py", line 776, in enter_debugger
    debugger.run(code)

  File "C:\Users\Daniel Rueda\.conda\envs\HydroThermPS\lib\site-packages\spyder_kernels\customize\spyderpdb.py", line 717, in run
    super(SpyderPdb, self).run(cmd, globals, locals)

  File "C:\Users\Daniel Rueda\.conda\envs\HydroThermPS\lib\bdb.py", line 578, in run
    exec(cmd, globals, locals)

  File "<string>", line 1, in <module>

TypeError: runfile() got an unexpected keyword argument 'current_namespace'
```

## Versions

* Spyder version: 5.1.1
* Python version: 3.7.10
* Qt version: 5.9.6
* PyQt version: 5.9.2
* Operating System name/version:  Windows 10 x64

### Dependencies

```

# Mandatory:
atomicwrites >=1.2.0          :  1.4.0 (OK)
chardet >=2.0.0               :  4.0.0 (OK)
cloudpickle >=0.5.0           :  1.6.0 (OK)
cookiecutter >=1.6.0          :  1.7.3 (OK)
diff_match_patch >=20181111   :  20200713 (OK)
intervaltree >=3.0.2          :  3.0.2 (OK)
IPython >=7.6.0               :  7.27.0 (OK)
jedi >=0.17.2;<0.19.0         :  0.18.0 (OK)
jsonschema >=3.2.0            :  3.2.0 (OK)
keyring >=17.0.0              :  23.1.0 (OK)
nbconvert >=4.0               :  6.1.0 (OK)
numpydoc >=0.6.0              :  1.1.0 (OK)
paramiko >=2.4.0              :  2.7.2 (OK)
parso >=0.7.0;<0.9.0          :  0.8.2 (OK)
pexpect >=4.4.0               :  4.8.0 (OK)
pickleshare >=0.4             :  0.7.5 (OK)
psutil >=5.3                  :  5.8.0 (OK)
pygments >=2.0                :  2.10.0 (OK)
pylint >=2.5.0                :  2.10.2 (OK)
pyls_spyder >=0.4.0           :  0.4.0 (OK)
pylsp >=1.2.1;<1.3.0          :  1.2.1 (OK)
pylsp_black >=1.0.0           :  None (OK)
qdarkstyle =3.0.2             :  3.0.2 (OK)
qstylizer >=0.1.10            :  0.2.1 (OK)
qtawesome >=1.0.2             :  1.0.3 (OK)
qtconsole >=5.1.0             :  5.1.1 (OK)
qtpy >=1.5.0                  :  1.10.0 (OK)
rtree >=0.9.7                 :  0.9.7 (OK)
setuptools >=49.6.0           :  57.4.0 (OK)
sphinx >=0.6.6                :  4.1.2 (OK)
spyder_kernels >=2.1.0;<2.2.0 :  2.1.0 (OK)
textdistance >=4.2.0          :  4.2.1 (OK)
three_merge >=0.1.1           :  0.1.1 (OK)
watchdog >=0.10.3             :  2.1.5 (OK)
zmq >=17                      :  22.2.1 (OK)

# Optional:
cython >=0.21                 :  None (OK)
matplotlib >=2.0.0            :  3.2.2 (OK)
numpy >=1.7                   :  1.20.3 (OK)
pandas >=1.1.1                :  1.3.2 (OK)
scipy >=0.17.0                :  1.7.1 (OK)
sympy >=0.7.3                 :  1.8 (OK)

```



Discussion:
Hey @Crueda96, thanks for reporting. This will be fixed in our next version (5.1.2), to be released shortly.

In the meantime, please downgrade the ipykernel package to its 6.2.0 version.

Resolving patch:
diff --git a/external-deps/spyder-kernels/spyder_kernels/console/start.py b/external-deps/spyder-kernels/spyder_kernels/console/start.py
--- a/external-deps/spyder-kernels/spyder_kernels/console/start.py
+++ b/external-deps/spyder-kernels/spyder_kernels/console/start.py
@@ -46,7 +46,7 @@ def import_spydercustomize():
 
     # Import our customizations
     site.addsitedir(customize_dir)
-    import spydercustomize
+    import spydercustomize  # noqa
 
     # Remove our customize path from sys.path
     try:
@@ -109,9 +109,18 @@ def kernel_config():
     # Spyder, to avoid deleting the sys module if users want to import
     # it through them.
     # See spyder-ide/spyder#15788
-    clear_argv = "import sys;sys.argv = [''];del sys"
+    clear_argv = "import sys; sys.argv = ['']; del sys"
     spy_cfg.IPKernelApp.exec_lines = [clear_argv]
 
+    # Set our runfile in builtins here to prevent other packages shadowing it.
+    # This started to be a problem since IPykernel 6.3.0.
+    if not PY2:
+        spy_cfg.IPKernelApp.exec_lines.append(
+            "import builtins; "
+            "builtins.runfile = builtins.spyder_runfile; "
+            "del builtins.spyder_runfile; del builtins"
+        )
+
     # Run lines of code at startup
     run_lines_o = os.environ.get('SPY_RUN_LINES_O')
     if run_lines_o is not None:
diff --git a/external-deps/spyder-kernels/spyder_kernels/customize/spydercustomize.py b/external-deps/spyder-kernels/spyder_kernels/customize/spydercustomize.py
--- a/external-deps/spyder-kernels/spyder_kernels/customize/spydercustomize.py
+++ b/external-deps/spyder-kernels/spyder_kernels/customize/spydercustomize.py
@@ -580,7 +580,13 @@ def runfile(filename=None, args=None, wdir=None, namespace=None,
         sys.argv = ['']
 
 
-builtins.runfile = runfile
+# IPykernel 6.3.0+ shadows our runfile because it depends on the Pydev
+# debugger, which adds its own runfile to builtins. So we replace it with
+# our own using exec_lines in start.py
+if PY2:
+    builtins.runfile = runfile
+else:
+    builtins.spyder_runfile = runfile
 
 
 def debugfile(filename=None, args=None, wdir=None, post_mortem=False,


Test patch:
diff --git a/external-deps/spyder-kernels/spyder_kernels/console/tests/test_console_kernel.py b/external-deps/spyder-kernels/spyder_kernels/console/tests/test_console_kernel.py
--- a/external-deps/spyder-kernels/spyder_kernels/console/tests/test_console_kernel.py
+++ b/external-deps/spyder-kernels/spyder_kernels/console/tests/test_console_kernel.py
@@ -27,7 +27,6 @@
 from flaky import flaky
 from jupyter_core import paths
 from jupyter_client import BlockingKernelClient
-from ipython_genutils import py3compat
 import numpy as np
 
 # Local imports
@@ -77,7 +76,8 @@ def setup_kernel(cmd):
 
         if kernel.poll() is not None:
             o,e = kernel.communicate()
-            e = py3compat.cast_unicode(e)
+            if not PY3 and isinstance(e, bytes):
+                e = e.decode()
             raise IOError("Kernel failed to start:\n%s" % e)
 
         if not os.path.exists(connection_file):