年明けになってから、俄然Pythonを触る機会が増えてきました。(主にFast API経由ですが)
せっかくなのでこの機会にPythonを自分のものにすべく、ブログでPythonに関するさまざまなトピックを取り上げ、自身の知識を深めていきたいと思います!(主に自分のため)
今回は、Pythonでのモジュールやファイルの読み込みに関する重要なポイント、絶対パスインポートのルールに焦点を当ててみます。
なお、ここからはFast APIを例にしてお話を進めていきます!
Pythonアプリケーションでのルートディレクトリの扱い
現在僕が制作に取り組んでいるFast APIを用いたPythonアプリケーションでは、以下のようなディレクトリ構成を採用しています。
この構成は比較的シンプルで、アプリケーションの規模が小さいため、複雑なディレクトリ分けはしていません。ただし、将来的にデータベースなどの要素が追加されると、この構成も変更される可能性があります。
さて、アプリケーションの「ルートディレクトリ」とは、プロジェクトの最上位ディレクトリを指します。僕が提示した画像におけるFast APIのアプリケーションの場合、最上位のディレクトリ=ルートディレクトリとなり、ここでアプリケーションの実行コマンドを実行したり、ここにソースコードや設定ファイルを配置します。
Fast APIに関していえば、厳密なディレクトリルールはありませんが、私の現在のプロジェクトではこのような形式を採用しています。
Pythonアプリケーションにおける絶対パスインポートの方法
さて、Pythonを書いていると、Python標準のモジュールやら別途インストールしたモジュールやら、さまざまなモジュールやファイルをインポートすることがあります!
Fast APIを含む多くのフレームワークでは、モジュールや別ファイル内の関数やクラスをインポートする際に絶対パスを使うことを推奨します。
では、絶対パスによるモジュールや別ファイルのインポートの基本的なルールは、どんなものになっているのでしょうか?
答えはシンプル!それは「絶対パスによるインポートは、アプリケーションのルートディレクトリを起点として行う」になります!
例えば、ルートディレクトリ内のapp
フォルダにあるconfig.py
にConfig
クラスがあり、Config
クラスをインポートする場合、以下のように記述します。
from app.config import Config
絶対パスを用いることで、ファイルの位置を容易に把握し、プロジェクトのメンテナンス性を高めることができます。
また、先述したようにFast APIに関していえばアプリケーション内のディレクトリ構成に明確なルールはありませんが、appディレクトリの中にアプリケーション関連のPythonファイルをまとめることで、わかりやすいルールに基づいたディレクトリ構造を作り上げることができます。
ファイル名だけでなくディレクトリ構造に気を遣うのも大事ですね…
なぜ、ルートディレクトリが起点になるの??
当たり前といえば当たり前かもしれませんが、なぜルートディレクトリ(正確にいえばPythonアプリケーションの起動ディレクトリ)を起点とするのでしょうか?
調べてみたところ、Pythonの標準モジュールであるsysモジュールによって、アプリケーションを起動したディレクトリがsys.pathに格納され、これが起点の所以になるような仕組みになっているのが理由のようです。
まとめ
今回は、Pythonでの絶対パスインポートのルールについて整理してみました。この知識を持つことで、ファイルの読み込みがより効率的になり、プロジェクトのメンテナンスがしやすくなりますね!