### 質問

python プロジェクトにおいて、基準のディレクトリを参照する設定・規約について、一般的なものはありますか？

### 背景

例えば Rails では、そのフレームワークに乗っかってコードを書く場合、 `Rails.root`
という変数が参照可能で、それはプロジェクトのルートディレクトリが参照できます。例えば、 `Rails.root / 'config' /
'foo_setting.yml'` とすると、「プロジェクトルート/config/foo_setting.yml」のパスに解決が可能です。

今、 python
のプロジェクトを開発していて、そこでコード中において「プロジェクトルート/conf/sqlalchemy.yml」ファイルの中身を参照したくなりました。毎回、そのパスを利用するコードにおいて、相対パスで指定してやれば参照は可能そうですが、しかし、コード中の相対パスは、コードベースが発展するに従い構造化され、その際に（コードファイル自体の移動により）変更を行う必要がありそうだ、と思っています。

なので、「プロジェクトルートからの相対パス」をアプリケーションのコード中で解決したいと思ったのですが、これは一般的 python
プロジェクトにおいてどのように実装されますか？
CC BY-SA 4.0
2019-03-12T04:23:19.703
53377
2020-06-02T12:03:45.393
754
question
python
python プロジェクトの基準ディレクトリの参照
```

    project/
        main.py
    
```

のような時にmain.py内で`import os`とした上で

```

    root = os.path.dirname(os.path.abspath(__file__))
    
```

とすれば`root`内に`"path/to/project/main.py"`が格納されます。  
これは`os.path.abspath`が絶対パスを取得するもので、`__file__`がpythonの予約語で自分自身のファイルパスをさすためです。

今回はディレクトリ名が欲しいように見受けられるので

```

    root = os.path.dirname(os.path.abspath(__file__))
    
```

として`"path/to/project/"`までを取得すると良いと思います。
CC BY-SA 4.0
2019-03-12T04:59:52.983
53379
2019-03-12T04:59:52.983
32497
53377
answer
> python プロジェクトにおいて、基準のディレクトリを参照する設定・規約について、一般的なものはありますか？

質問の趣旨から外れている気もしますが、ディレクトリ構成の「推奨？」を見つけました。

  * [Repository Structure and Python](https://kenreitz.org/essays/repository-structure-and-python)

> 「プロジェクトルートからの相対パス」をアプリケーションのコード中で解決したいと思ったのですが、これは一般的 python
> プロジェクトにおいてどのように実装されますか？

[Python-ルートプロジェクト構造のパスを取得](https://www.it-
swarm.dev/ja/python/python%E3%83%AB%E3%83%BC%E3%83%88%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%A7%8B%E9%80%A0%E3%81%AE%E3%83%91%E3%82%B9%E3%82%92%E5%8F%96%E5%BE%97/1048058439/)のページを見つけました。  
`utils.py`で`def get_project_root() -> Path:`を定義するというものです。  
一般的かは分かりませんが、よい方法だと思いました。

* * *

「変更が予想されている、変更があると対応が大変」な場合はトップレベルの設定ファイルに個別設定ファイルのパスを定義しておいてはいかがでしょうか。  
小規模なプロジェクトであれば「ディレクトリ階層をシンプルに保つ」でよいと思います。

設定ファイルと定義、参照については以下が参考になると思います。

  * [configparser --- 設定ファイルのパーサー](https://docs.python.org/ja/3/library/configparser.html)
CC BY-SA 4.0
2020-04-28T07:26:08.010
66060
2020-04-28T07:26:08.010
35558
53377
answer