From 1ccbb836b56b2c3743a96811435093c9e0d62c59 Mon Sep 17 00:00:00 2001 From: Ryan Clary <9618975+mrclary@users.noreply.github.com> Date: Fri, 1 Mar 2024 21:53:04 -0800 Subject: [PATCH] Clean up current working directory manipulations --- spyder_kernels/console/kernel.py | 10 ++----- spyder_kernels/console/start.py | 30 +++++++++---------- .../console/tests/test_console_kernel.py | 5 ++-- 3 files changed, 20 insertions(+), 25 deletions(-) diff --git a/spyder_kernels/console/kernel.py b/spyder_kernels/console/kernel.py index 8b4b2670..000e1b25 100644 --- a/spyder_kernels/console/kernel.py +++ b/spyder_kernels/console/kernel.py @@ -79,11 +79,6 @@ def __init__(self, *args, **kwargs): # To track the interactive backend self.interactive_backend = None - # Re-add current working directory path into sys.path after - # removing it before kernel started - if '' not in sys.path: - sys.path.insert(0, '') - # Store original sys.path. Kernels are started with PYTHONPATH # removed from environment variables, so this will never have # user paths and should be clean. @@ -775,8 +770,9 @@ def update_syspath(self, new_path, prioritize): # Ensure current directory is always first to imitate Python # standard behavior - sys.path.remove('') - sys.path.insert(0, '') + if '' in sys.path: + sys.path.remove('') + sys.path.insert(0, '') else: sys.path[:] = self._sys_path + new_path else: diff --git a/spyder_kernels/console/start.py b/spyder_kernels/console/start.py index c66c086f..2d79a1dd 100644 --- a/spyder_kernels/console/start.py +++ b/spyder_kernels/console/start.py @@ -16,6 +16,15 @@ import sys import site +# Remove current directory from sys.path to prevent kernel +# crashes when people name Python files or modules with +# the same name as standard library modules. +# See spyder-ide/spyder#8007 +# Inject it back into sys.path after all imports in this module but +# before the kernel is initialized +while '' in sys.path: + sys.path.remove('') + # Third-party imports from traitlets import DottedObjectName @@ -29,14 +38,6 @@ def import_spydercustomize(): parent = osp.dirname(here) customize_dir = osp.join(parent, 'customize') - # Remove current directory from sys.path to prevent kernel - # crashes when people name Python files or modules with - # the same name as standard library modules. - # See spyder-ide/spyder#8007 - # Inject it back into sys.path after kernel starts - while '' in sys.path: - sys.path.remove('') - # Import our customizations site.addsitedir(customize_dir) import spydercustomize # noqa @@ -177,13 +178,6 @@ def main(): # Import our customizations into the kernel import_spydercustomize() - # Remove current directory from sys.path to prevent kernel - # crashes when people name Python files or modules with - # the same name as standard library modules. - # See spyder-ide/spyder#8007 - while '' in sys.path: - sys.path.remove('') - # Main imports from ipykernel.kernelapp import IPKernelApp from spyder_kernels.console.kernel import SpyderKernel @@ -216,6 +210,12 @@ def close(self): kernel.config = kernel_config() except: pass + + # Re-add current working directory path into sys.path after all of the + # import statements, but before initiializing the kernel. + if '' not in sys.path: + sys.path.insert(0, '') + kernel.initialize() # Set our own magics diff --git a/spyder_kernels/console/tests/test_console_kernel.py b/spyder_kernels/console/tests/test_console_kernel.py index 76d84c48..fdf6d9ad 100644 --- a/spyder_kernels/console/tests/test_console_kernel.py +++ b/spyder_kernels/console/tests/test_console_kernel.py @@ -524,17 +524,16 @@ def test_cwd_in_sys_path(): def test_prioritize(kernel): """Test that user path priority is honored in sys.path.""" syspath = kernel.get_syspath() - syspath.remove('') append_path = ['/test/append/path'] prepend_path = ['/test/prepend/path'] kernel.update_syspath(append_path, prioritize=False) new_syspath = kernel.get_syspath() - assert new_syspath == [''] + syspath + append_path + assert new_syspath == syspath + append_path kernel.update_syspath(prepend_path, prioritize=True) new_syspath = kernel.get_syspath() - assert new_syspath == [''] + prepend_path + syspath + assert new_syspath == prepend_path + syspath @flaky(max_runs=3)