1717from .kernelbase import Kernel as KernelBase
1818from .zmqshell import ZMQInteractiveShell
1919from .eventloops import _use_appnope
20- from .debugger import Debugger
2120from .compiler import XCachingCompiler
2221
2322try :
3433except ImportError :
3534 _use_experimental_60_completion = False
3635
36+ try :
37+ import debugpy
38+ from .debugger import Debugger
39+ _is_debugpy_available = True
40+ except ImportError :
41+ _is_debugpy_available = False
42+
3743_EXPERIMENTAL_KEY_NAME = '_jupyter_types_experimental'
3844
3945
@@ -46,7 +52,7 @@ class IPythonKernel(KernelBase):
4652 help = "Set this flag to False to deactivate the use of experimental IPython completion APIs." ,
4753 ).tag (config = True )
4854
49- debugpy_stream = Instance (ZMQStream , allow_none = True )
55+ debugpy_stream = Instance (ZMQStream , allow_none = True ) if _is_debugpy_available else None
5056
5157 user_module = Any ()
5258 @observe ('user_module' )
@@ -72,11 +78,12 @@ def __init__(self, **kwargs):
7278 super (IPythonKernel , self ).__init__ (** kwargs )
7379
7480 # Initialize the Debugger
75- self .debugger = Debugger (self .log ,
76- self .debugpy_stream ,
77- self ._publish_debug_event ,
78- self .debug_shell_socket ,
79- self .session )
81+ if _is_debugpy_available :
82+ self .debugger = Debugger (self .log ,
83+ self .debugpy_stream ,
84+ self ._publish_debug_event ,
85+ self .debug_shell_socket ,
86+ self .session )
8087
8188 # Initialize the InteractiveShell subclass
8289 self .shell = self .shell_class .instance (parent = self ,
@@ -152,10 +159,11 @@ def __init__(self, **kwargs):
152159 }
153160
154161 def dispatch_debugpy (self , msg ):
155- # The first frame is the socket id, we can drop it
156- frame = msg [1 ].bytes .decode ('utf-8' )
157- self .log .debug ("Debugpy received: %s" , frame )
158- self .debugger .tcp_client .receive_dap_frame (frame )
162+ if _is_debugpy_available :
163+ # The first frame is the socket id, we can drop it
164+ frame = msg [1 ].bytes .decode ('utf-8' )
165+ self .log .debug ("Debugpy received: %s" , frame )
166+ self .debugger .tcp_client .receive_dap_frame (frame )
159167
160168 @property
161169 def banner (self ):
@@ -414,7 +422,8 @@ def do_complete(self, code, cursor_pos):
414422 'status' : 'ok' }
415423
416424 async def do_debug_request (self , msg ):
417- return await self .debugger .process_request (msg )
425+ if _is_debugpy_available :
426+ return await self .debugger .process_request (msg )
418427
419428 def _experimental_do_complete (self , code , cursor_pos ):
420429 """
0 commit comments