Streamz not working in Jupyterlite

オープン
#467 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
42/100
issue の種類
バグ
明瞭さ
おおむね明確
活発さ
停滞
技術スタック
jupyter-notebook, python

調査の方向性

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.

索引モデルが issue の本文から書いたものです。

説明

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

import piplite
await piplite.install(['panel', 'streamz'])
  • Verify the exception is raised

image

---------------------------------------------------------------------------
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.
主要言語
Python
スター
1.3k
フォーク
149
PR マージ指標
30日以内にマージされた PR はありません

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

python-streamz/streamz のほかの issue

python-streamz/streamz の issue をすべて見る

似ている issue

Python の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。