Streamz not working in Jupyterlite
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 42/100
- Type d'issue
- Bug
- Clarté
- Plutôt claire
- Activité
- À l'abandon
- Stack technique
- jupyter-notebook, python
- Domaine
- stream-processing, web-dev
Piste de recherche
Start by reproducing the failure with piplite.install(['panel', 'streamz']) or micropip.install(['streamz']) in JupyterLite, focusing on the missing pure-Python wheel for tornado. Review Streamz's package dependencies and the linked Panelite DataFrame example; done means Streamz installs in the browser and its referenced examples work.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Hi
I'm currently improving the user experience when running HoloViz Panel in Jupyterlite (Panelite). We have a Streamz pane and also some examples using Streamz. For example https://panelite.holoviz.org/lab/index.html?path=reference/panes/DataFrame.ipynb.
Unfortunately Streamz cannot be installed in Jupyterlite. Would love to see it working in the browser.
Reproduce
- Open https://jupyter.org/try-jupyter/lab/
- Open a new notebook and run a cell containing
import piplite
await piplite.install(['panel', 'streamz'])
- Verify the exception is raised

---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[2], line 2
1 import micropip
----> 2 await micropip.install(["streamz"])
File /lib/python3.10/site-packages/micropip/_micropip.py:573, in install(requirements, keep_going, deps, credentials, pre)
563 wheel_base = Path(getsitepackages()[0])
565 transaction = Transaction(
566 ctx=ctx,
567 ctx_extras=[],
(...)
571 fetch_kwargs=fetch_kwargs,
572 )
--> 573 await transaction.gather_requirements(requirements)
575 if transaction.failed:
576 failed_requirements = ", ".join([f"'{req}'" for req in transaction.failed])
File /lib/python3.10/site-packages/micropip/_micropip.py:333, in Transaction.gather_requirements(self, requirements)
330 for requirement in requirements:
331 requirement_promises.append(self.add_requirement(requirement))
--> 333 await gather(*requirement_promises)
File /lib/python3.10/asyncio/futures.py:284, in Future.__await__(self)
282 if not self.done():
283 self._asyncio_future_blocking = True
--> 284 yield self # This tells Task to wait for completion.
285 if not self.done():
286 raise RuntimeError("await wasn't used with future")
File /lib/python3.10/asyncio/tasks.py:304, in Task.__wakeup(self, future)
302 def __wakeup(self, future):
303 try:
--> 304 future.result()
305 except BaseException as exc:
306 # This may also be a cancellation.
307 self.__step(exc)
File /lib/python3.10/asyncio/futures.py:201, in Future.result(self)
199 self.__log_traceback = False
200 if self._exception is not None:
--> 201 raise self._exception
202 return self._result
File /lib/python3.10/asyncio/tasks.py:234, in Task.__step(***failed resolving arguments***)
232 result = coro.send(None)
233 else:
--> 234 result = coro.throw(exc)
235 except StopIteration as exc:
236 if self._must_cancel:
237 # Task is cancelled right before coro stops.
File /lib/python3.10/site-packages/micropip/_micropip.py:340, in Transaction.add_requirement(self, req)
337 return await self.add_requirement_inner(req)
339 if not urlparse(req).path.endswith(".whl"):
--> 340 return await self.add_requirement_inner(Requirement(req))
342 # custom download location
343 wheel = WheelInfo.from_url(req)
File /lib/python3.10/site-packages/micropip/_micropip.py:448, in Transaction.add_requirement_inner(self, req)
443 if self.check_version_satisfied(req):
444 # Maybe while we were downloading pypi_json some other branch
445 # installed the wheel?
446 return
--> 448 await self.add_wheel(wheel, req.extras)
File /lib/python3.10/site-packages/micropip/_micropip.py:463, in Transaction.add_wheel(self, wheel, extras)
461 await wheel.download(self.fetch_kwargs)
462 if self.deps:
--> 463 await self.gather_requirements(wheel.requires(extras))
465 self.wheels.append(wheel)
File /lib/python3.10/site-packages/micropip/_micropip.py:333, in Transaction.gather_requirements(self, requirements)
330 for requirement in requirements:
331 requirement_promises.append(self.add_requirement(requirement))
--> 333 await gather(*requirement_promises)
File /lib/python3.10/asyncio/futures.py:284, in Future.__await__(self)
282 if not self.done():
283 self._asyncio_future_blocking = True
--> 284 yield self # This tells Task to wait for completion.
285 if not self.done():
286 raise RuntimeError("await wasn't used with future")
File /lib/python3.10/asyncio/tasks.py:304, in Task.__wakeup(self, future)
302 def __wakeup(self, future):
303 try:
--> 304 future.result()
305 except BaseException as exc:
306 # This may also be a cancellation.
307 self.__step(exc)
File /lib/python3.10/asyncio/futures.py:201, in Future.result(self)
199 self.__log_traceback = False
200 if self._exception is not None:
--> 201 raise self._exception
202 return self._result
File /lib/python3.10/asyncio/tasks.py:232, in Task.__step(***failed resolving arguments***)
228 try:
229 if exc is None:
230 # We use the `send` method directly, because coroutines
231 # don't have `__iter__` and `__next__` methods.
--> 232 result = coro.send(None)
233 else:
234 result = coro.throw(exc)
File /lib/python3.10/site-packages/micropip/_micropip.py:337, in Transaction.add_requirement(self, req)
335 async def add_requirement(self, req: str | Requirement) -> None:
336 if isinstance(req, Requirement):
--> 337 return await self.add_requirement_inner(req)
339 if not urlparse(req).path.endswith(".whl"):
340 return await self.add_requirement_inner(Requirement(req))
File /lib/python3.10/site-packages/micropip/_micropip.py:435, in Transaction.add_requirement_inner(self, req)
432 metadata = await _get_pypi_json(req.name, self.fetch_kwargs)
434 try:
--> 435 wheel = find_wheel(metadata, req)
436 except ValueError:
437 self.failed.append(req)
File /lib/python3.10/site-packages/micropip/_micropip.py:303, in find_wheel(metadata, req)
300 if best_wheel is not None:
301 return wheel
--> 303 raise ValueError(
304 f"Can't find a pure Python 3 wheel for '{req}'.\n"
305 f"See: {FAQ_URLS['cant_find_wheel']}\n"
306 "You can use `micropip.install(..., keep_going=True)`"
307 "to get a list of all packages with missing wheels."
308 )
ValueError: Can't find a pure Python 3 wheel for 'tornado'.
See: https://pyodide.org/en/stable/usage/faq.html#micropip-can-t-find-a-pure-python-wheel
You can use `micropip.install(..., keep_going=True)`to get a list of all packages with missing wheels.
- Langage dominant
- Python
- Étoiles
- 1.3k
- Forks
- 149
- Métriques de merge des PR
- Aucune PR mergée en 30 j
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de python-streamz/streamz
-
pkg_resources warning Ouverte
Difficulté 3/5 1-2 jours Accessibilité débutants 35/100
python-streamz/streamz#481 · 4 commentaires ·
-
Combining the streamz.Stream.filenames() and streamz.Stream.from_textfile() using dask scatter? Ouverte
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 25/100
python-streamz/streamz#480 · 2 commentaires ·
-
Compile the code into c++ Ouverte
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 20/100
python-streamz/streamz#479 · 1 commentaire ·
-
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 20/100
python-streamz/streamz#478 · 6 commentaires ·
-
Difficulté 4/5 3-5 jours Accessibilité débutants 10/100
python-streamz/streamz#476 · 17 commentaires · 2 réactions ·
Toutes les issues de python-streamz/streamz
Issues similaires
-
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
-
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
-
enhancement
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
-
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100