2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Jupyter/Google ColabでDenoを使う

Last updated at Posted at 2024-06-02

概要

Jupyter(Google Colab)のコードセルでJavaScript/TypeScriptが書ければ便利なんじゃないかと思って試行錯誤した結果の記録

Denoである理由

Denoの特徴の1つであるURL importによるパッケージインストール作業不要のモジュール取り込みはJuypterのコードセルのような基本再利用を前提としない書き捨てコーディング環境にはもってこいの機能だと思うので使えるようになったら面白いかなと。

Denoカーネルを使わない理由

Denoは公式でJupyterカーネルを出してるのでそれをインストールすればいいじゃん…と思うかもしれませんが、残念ながら2024年6月現在DenoカーネルはGoogle Colabでは動かないようです。動くようになればこの記事は不要になるんですが(とはいえマジックコマンド非対応なのでIframe表示とかできなさそうですが…)

実現方法

これを実現するためにはセルマジックを使うのがいいようです。セルマジックはコードセルの先頭行にコマンドを書くことでそのコードセル全体の内容を引数として独自の処理をするというものです。

セルマジックの実態はほぼ単なるPython関数なので、PythonでDenoを呼び出して取得したコードセルの内容を渡す感じになります。こんな感じ(あらかじめDenoをインストールしてパスを通す必要があります)

@register_cell_magic
def run_deno(line, cell):
    """
    Denoのコードを実行するマジックコマンド
    """
    # Denoコマンドを実行
    denocmd = "deno"
    process = subprocess.Popen(
        [denocmd, "eval", cell],
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
    )

    stdout, stderr = process.communicate()

    # 結果を表示
    if process.returncode == 0:
        print(stdout.decode("utf-8"))
    else:
        print(stderr.decode("utf-8"))

Google Colab対応

Google Colabにも対応ができたらいいなと思うのですが、Colabの場合Denoをランタイムが再起動する度にインストールし直す必要があるようです、またパスを通しても他のセルに反映されないっぽいので(やり方あるのかな?)Denoコマンドをフルパスで呼び出す必要がありそうです、結局なんだかんだJupyterとは処理が異なる感じになりそうなので場合分けするしかなさそう。

# Google Colabで実行しているかどうかを判定
def is_google_colab():
    try:
        import google.colab  # type: ignore  # noqa: F401
        return True
    except ImportError:
        return False


# Denoコマンド
def get_deno_cmd():
    if is_google_colab():
        return "/root/.deno/bin/deno"
    else:
        return "deno"


def install_deno_colab():
    """
    Denoのインストール(Google Colab用)
    """
    if not is_google_colab():
        print("Google Colab環境ではありません。Denoのインストールをスキップします。")
        return

    # Denoのインストールコマンド
    command = "curl -fsSL https://deno.land/x/install/install.sh | sh"

    # シェルコマンドを実行
    process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout, stderr = process.communicate()

    # 出力を表示
    if process.returncode == 0:
        print("Denoをインストールしました。")
        print(stdout.decode())
    else:
        print("Denoのインストール中にエラーが発生しました。")
        print(stderr.decode())

GitHubに載せてみた

その他、せっかくJavaScript/TypeScriptが使えるのだからブラウザ環境での実行も出来たら便利そうだなと思い、DenoでトランスパイルしたJavaScriptを差し込んだHTMLを生成してIFrameに出力するセルマジックも作って合わせてGitHubに公開してみました。

ついでに、コードセルのPythonコードをPyScriptを利用してブラウザ環境で実行するマジックコマンドも作ってみた。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?