relative path from the python file itself
Project description
relpath
!!! このドキュメントは書きかけです。 !!! This document is a work in progress.
下の方に日本語・●・●の説明があります
概要 (日本語)
このパッケージでできること:
- 直感的な相対パス参照ができる
- pythonのパス参照の仕様は直感に反する
- モジュールの相対importに使える
- フォルダが多重で複雑なプロジェクトにも対応できる
使い方1: 基本的な例
下記は、pythonファイル自身の場所(ディレクトリ)を取得する例です。
import relpath as rp
print(rp.rel2abs("./")) # -> "(このpythonファイルが存在するディレクトリ)"
使い方2: 実用的な例
このツールは、下記のような場合に真価を発揮します。
.
`-- project_folder
|-- parts
| |-- data.txt
| `-- script_B.py
`-- script_A.py
上記のように、複数のpythonファイルからなるプロジェクトを考えます。
script_A.py
の中では下記のように、script_B.py
を利用します。
# script_A.py
# load script_B.py
from parts.script_B import get_data
print(get_data())
この場合に、下記のコード例のように、
script_B.py
から"./data.txt"を相対的に読み込もうとすると失敗します。^1
# script_B.py
def get_data():
with open("./data.txt", "r") as f: # -> FileNotFoundError: [Errno 2] No such file or directory: './data.txt'
return f.read()
そこで、relpath
パッケージを使って下記のように書くと、
"./data.txt"を相対的に読み込めるようになります。^2
# script_B.py
from relpath import rel2abs
def get_data():
with open(rel2abs("./data.txt"), "r") as f: # -> NO ERROR!!
return f.read()
使い方3: 相対importとしての利用
relpath
パッケージを利用すると、下記の例のように、
モジュールの直感的な相対importを実現できます。
from relpath import add_import_path
add_import_path("../")
from my_module import some_function
some_function()
上記の例を見ると、単にsys.path.append("../")
としても動作するように思われます。
しかし、プロジェクトフォルダの階層構造が複雑で、1つのモジュールが別々の場所から使われるような場合には、sys.path.append("../")
では対応できないことがあります。
そのため、相対importを実現したいときは、常にrelpath
パッケージのadd_import_path
を利用することを推奨します。
なお、add_import_path("../")
は、内部的にはsys.path.append(rel2abs("../"))
と等価です。
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.