はじめに
みなさま、colaboratory使ってますか?
無償で中々のスペックの環境が利用できるので非常に便利ですが、そこで作成したノートブックは、Google Driveに保存され、管理や共有には若干手間がかかります。
一方で、GitHubに保存したノートブックは、colaboratoryで開くこともできますし、他のファイルとまとめて管理したり共有したりするのに便利です。
ただ、colaboratoryで作成したノートブックをGitHubに保存した後は、自動保存されたGoogleDrive上のノートブックを削除しないといけないし、それを回避するために先にGitHubレポジトリにファイルを作るのも結構面倒・・・。
そういう訳で、ズボラに使いまわせるよう、GitHubにレポジトリとノートブックを作成するノートブックを作ってみました。
手順
今回作成したノートブックはこちらで置いています。
事前準備は以下の通りです。慣れていれば10分程度、そうでなくても20分くらいで済みます。
- GitHubのアクセストークンを取得する
- 参考: GitHub「Personal access tokens」の設定方法
- Google Driveの任意の環境に前述のノートブックを保存する
- アクセストークンを使うので、非公開設定にしておくこと
- ノートブックのアクセストークンを自分のもので書き換えておく
ここまで設定すれば、次からは、必要な時に以下の手順を行うだけです。
- Google Driveでノートブックを開く
- ノートブック内で作成するレポジトリ名やノートブック名を指定する
- ノートブックを実行する
- リンクが生成されるので、ノートブックを開く
一度作成したノートブックの変更は、colaboratoryのツールバー上で「ファイル」「GitHubにコピーを保存」から反映できます。
ノートブックの詳細
設定
使用するライブラリをインストールし、レポジトリやファイル名を設定。
アクセストークンは各自取得したものに置き換えます。
!pip install -q PyGitHub
from github import Github, GithubException
import nbformat
access_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
repository_name = 'TestRepository'
ipynb_file_name = 'test.ipynb'
レポジトリ作成
指定したレポジトリが存在しない場合作成します。
github = Github(access_token)
user = github.get_user()
try:
user.create_repo(repository_name)
except GithubException:
print(f'{repository_name} already exists on this account.')
ノートブックデータ作成
作成するノートブックをここで定義します。通常のプログラムのセルは勿論、マークダウンセルも定義できる。
自分がよく使う設定があればここを書き換える。
nb = nbformat.v4.new_notebook()
title = '# setting'
code = """
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
"""
nb["cells"] = [
nbformat.v4.new_markdown_cell(title),
nbformat.v4.new_code_cell(code)
]
レポジトリでノートブック作成
前段で定義したノートブックをレポジトリ上に作成します。
同名のファイルがあるときは怒られるので、エラーを出すようにしています。
repo = user.get_repo(repository_name)
try:
repo.get_contents(ipynb_file_name)
raise(Exception(f'{ipynb_file_name} already exists in {repository_name}.'))
except GithubException as e:
repo.create_file(ipynb_file_name, f'create {ipynb_file_name}', nbformat.writes(nb))
作成ファイルのリンク出力
GitHubに作成したファイルは、以下の規則のリンクでアクセスできます。
print(f'github: https://github.com/{user.login}/{repository_name}/blob/master/{ipynb_file_name}')
print(f'colab: https://colab.research.google.com/github/{user.login}/{repository_name}/blob/master/{ipynb_file_name}')