こんにちは、ごんさくです。
Google Colaboratory1は、Pythonや機械学習の勉強などに使える非常に優秀なツールですよね。
私もよく使っているのですが、最近ローカル環境にGitHub Copilotを導入したことからコーディングはローカル(VS Code)、実行はGoogle Colaboratoryという使い分けをしています。
そのように複数環境で1つのソースコード実行する場合、例えばフォルダパスなど環境ごとに差異があると、実行環境に合わせて処理を書き分ける(分岐する)必要があります。
本記事では、プログラムの実行環境がGoogle Colaboまたはローカル環境かどうかを判定する方法を紹介します。
この方法を取り入れることで、実行環境に合わせて処理を修正したりする手間がなくなります。
私と同じように複数環境でPythonプログラムを実行している方、同じような経験をしたことがある方はぜひ試してみてください。
Google Coraboratoyかどうかの判定
Google Colaboratoryかどうかを判定するために、Pythonの標準ライブラリであるsys
2を利用します。
本記事では判定方法について次の2つを記載していますので、自身のローカル環境やフォルダ構成などと合わせて実装してみてください。
- sys.path
- sys.platform
sys.pathを使う場合
Google Colaboratoryでsys.path
を実行した場合、取得したリスト内に/content
が含まれます。
そのため、sys.path
の実行結果に/content
が含まれるかどうかで判定します。
import sys
path_list = sys.path
is_colabo = True if '/content' in path_list else False
print(is_colabo) # Google Colabo上で実行している場合はTrue
ローカル環境のフォルダ構成にcontentフォルダがある場合は、sys.path
の実行結果に/content
が含まれる場合があります。
その場合は、sys.platform
を使用してください。
sys.platformを使う場合
Google Colaboratoryでsys.platform
を実行した場合、取得した文字列がlinux
となります。
そのため、sys.platform
の実行結果がlinux
かどうかで判定します。
import sys
platform = sys.platform
is_colabo = True if platform == 'linux' else False
print(is_colabo) # Google Colabo上で実行している場合はTrue
ローカル環境のOSがLinuxの場合、sys.platform
の実行結果がGoogle Colaboと同じlinux
になる可能性があります。
その場合は、sys.path
を使用してください。
判定後の処理ではis_colaboを使用する
特に説明は不要かもしれませんが、Google Colaboの判定処理を最初に実装したあとは、判定処理結果を格納した変数is_colabo
を使用します。
よくあるパターンとしては、ローカル環境とGoogle Colaboでファイル出力パス分岐する場合などに使います。
if is_colabo:
# Google Colaboの場合のファイル出力パス
output_path = '/content/drive/MyDrive/MyProject/output/'
else:
# ローカル環境の場合のファイル出力パス
output_path = './output/'
まとめ(Google Colaboの判別処理)
本記事ではGoogle Colaboかどうかの判別処理について説明しました。同じプロジェクトワークスペースをローカル環境とGoogle Colabo上で動かす場合に絶大な威力を発揮します。
ただレアケースではありますが、sys.path、sys.platformのどちらも使用できないパターンが存在するので、他の方法も模索中です。もっと効率的な実装方法がありましたら本記事を更新していきたいと思います。
では!
- Google Colaboratoryは、Pythonの開発・実行環境をクラウド上で利用できるサービスです。
データサイエンスやDeep Learningのライブラリが最初からインストールされていたり、GPUが無料で使えたりするなど、特に機会学習の勉強に非常に有用です。 ↩︎ sys
は実行環境で使用・管理している変数や、動作に関連する関数を定義されたモジュールです。
Pythonドキュメント ↩︎