LoginSignup
6
1

More than 3 years have passed since last update.

ぼくも、Jupyterで、PowerShell

Posted at

LC4RIの時間だ

いろいろあって、こーゆーの作って、使ってます。

ansibleカーネルは、JANOG44ハッカソンで、ビッグローブさんのチームが使ってて、個人的にansibleは、playbookで隠蔽されるのが嫌だったので、良いなーと思ったので入れてみました。まだ、使ってませんが......

sshカーネルは、ぼくの前職のNIIと富士通研究所さんの共同研究の成果物で、興味持つ人が多いので入れてみました。演習とかで使ってます。NIIで作ったwrapperカーネルと繋げれてないので、セル単位の実行ログ保存とかは出来ないのですが、python3を持ち出すと面倒な状況でターミナルっぽく使えるのは良いですね。ただ、僕が踏み抜いてバグ見つけたりしてるので、環境によっては問題あるかも知れません。誰が直すか勝負だ!

PowerShellカーネル

さて、今日は、PowerShellカーネルの話をしましょう。

NIIクラウド運用チームでは、LC4RIと呼ぶ、Jupyterを使った情報システムの構築・運用手法を実践・提唱しています。手法のコンセプトに基づき、Jupyterのプラグインも多数開発しています。

その中に、セルの実行結果に応じて、失敗なら赤に色付けするといった機能があります。Jupyterの内部では、セルの実行結果を「ok」か「error」で返せるようになっているので、それに応じて色を付け、ひと目で状況が理解できるようにしています。

で、PowerShellカーネルなんですが、セルの実行が、成功しても、失敗しても、成功しましたって色になるんですね......

コードを見てみましょう。

    def do_execute(self, code, silent, store_history=True,
                   user_expressions=None, allow_stdin=False):
        try:
            if not code.strip():
                return {'status': 'ok', 'execution_count': self.execution_count,
                        'payload': [], 'user_expressions': {}}

            if not self.proxy:
                self.__createProxy()

            output = self.proxy.run_command(code)

            message = {'name': 'stdout', 'text': output}
            self.send_response(self.iopub_socket, 'stream', message)

            return {'status': 'ok', 'execution_count': self.execution_count,
                    'payload': [], 'user_expressions': {}}

        except Exception:
            excInfo = sys.exc_info()
            message = {
                'ename': str(excInfo[0].__name__),
                'evalue': str(excInfo[1]),
                'traceback': [traceback.format_exc()]
            }
            self.send_response(self.iopub_socket, 'error', message)
            message['status'] = 'error'
            return message

例外発生時は「error」を返すんですが、そうでなければ無条件に「ok」を返しています。

そもそも、PowerShellでは、終了コードが環境変数渡しになっているようで、「PowerShell での終了ステータス($?、$LastExitCode) について確認してみた」を参考に試してみた結果、「\$ErrorActionPreference = "Stop"」を設定すると、コマンド実行後に「$?」を確認することで、成功失敗が判別できることを確認しました。

とゆーわけで、「\$ErrorActionPreference = "Stop"」はデフォルトじゃないので、ユーザに明示的に設定させるとして、コマンド実行後に「$?」を取ってきて、その内容に応じて「ok」「error」を返しましょうよってことで、

プルリク上げました。

まだ終わらんよ

でもね、今、リリースされてる0.1.2だと、ここのコードが違ってるし、取り敢えず、プルリク取り込まれた新しい版が出るまでは、0.1.2にパッチ当てて凌ぐ必要があるわけです。

なので、

Dockerfile内でパッチ当ててます。

さいごに

LC4RIやるにしても、小規模なJupyterHubが欲しい時も、

が超カンタンなので、みんなも使おうね。

6
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
6
1