(self)
| 53 | self.execution_count = 0 |
| 54 | |
| 55 | async def start(self) -> None: |
| 56 | if self._client: |
| 57 | return |
| 58 | |
| 59 | # Ensure dependencies exist before importing. |
| 60 | install_package('ipykernel') |
| 61 | install_package('jupyter-client') |
| 62 | |
| 63 | from jupyter_client import AsyncKernelManager |
| 64 | |
| 65 | logger.info('Starting local ipykernel session...') |
| 66 | self._km = AsyncKernelManager( |
| 67 | kernel_name=self.kernel_name, |
| 68 | env=self.env, |
| 69 | cwd=str(self.working_dir)) # cwd may be ignored here |
| 70 | |
| 71 | start_kernel_result = self._km.start_kernel( |
| 72 | extra_arguments=self.extra_arguments, |
| 73 | env=self.env, |
| 74 | cwd=str(self.working_dir), |
| 75 | ) |
| 76 | if inspect.isawaitable(start_kernel_result): |
| 77 | await start_kernel_result |
| 78 | |
| 79 | client = self._km.client() |
| 80 | if inspect.isawaitable(client): |
| 81 | client = await client |
| 82 | self._client = client |
| 83 | |
| 84 | start_channels_result = self._client.start_channels() |
| 85 | if inspect.isawaitable(start_channels_result): |
| 86 | await start_channels_result |
| 87 | |
| 88 | # Give kernel a moment to fully initialize before accepting code |
| 89 | await asyncio.sleep(0.5) |
| 90 | |
| 91 | self.start_ts = time.time() |
| 92 | self.execution_count = 0 |
| 93 | logger.info('Local ipykernel session ready.') |
| 94 | |
| 95 | async def stop(self) -> None: |
| 96 | if not self._client and not self._km: |
no test coverage detected