1. ホーム
  2. python

Pythonスクリプトからカレントディレクトリの親を取得する

2023-12-05 03:13:44

質問

Pythonスクリプトからカレントディレクトリの親を取得したい。例えば、私はスクリプトを /home/kristina/desire-directory/scripts から起動した場合、この場合の希望するパスは /home/kristina/desire-directory

私が知っているのは sys.path[0] から sys . しかし、私はパースしたくない sys.path[0] 結果文字列をパースしたくない。Pythonでカレントディレクトリの親を取得するための他の方法はありますか?

どのように解決するのですか?

os.pathを使用する

への スクリプトを含むディレクトリの親ディレクトリを取得する を (現在の作業ディレクトリに関係なく) 取得するためには __file__ .

スクリプトの内部では os.path.abspath(__file__) を使ってスクリプトの絶対パスを取得し os.path.dirname を2回呼び出す。

from os.path import dirname, abspath
d = dirname(dirname(abspath(__file__))) # /home/kristina/desire-directory

基本的には、ディレクトリツリーの上を歩いていくには os.path.dirname を何度でも呼び出すことでディレクトリツリーをたどっていくことができます。例

In [4]: from os.path import dirname

In [5]: dirname('/home/kristina/desire-directory/scripts/script.py')
Out[5]: '/home/kristina/desire-directory/scripts'

In [6]: dirname(dirname('/home/kristina/desire-directory/scripts/script.py'))
Out[6]: '/home/kristina/desire-directory'

もし、あなたが 現在の作業ディレクトリの親ディレクトリを取得する を使用します。 os.getcwd :

import os
d = os.path.dirname(os.getcwd())

pathlibの使用

また pathlib モジュール (Python 3.4 以降で利用可能) を使うこともできます。

それぞれ pathlib.Path のインスタンスには parent 属性は親ディレクトリを参照し、さらに parents 属性は、パスの祖先のリストです。 Path.resolve は絶対パスを取得するために使われるかもしれません。また、全てのシンボリックリンクを解決しますが、その際に Path.absolute を使うこともできます。

Path(__file__)Path() はそれぞれスクリプトのパスと現在の作業ディレクトリを表し、したがって スクリプトディレクトリの親ディレクトリを取得する (現在の作業ディレクトリに関係なく)取得するためには

from pathlib import Path
# `path.parents[1]` is the same as `path.parent.parent`
d = Path(__file__).resolve().parents[1] # Path('/home/kristina/desire-directory')

とし 現在の作業ディレクトリの親ディレクトリを取得する

from pathlib import Path
d = Path().resolve().parent

なお dPath のインスタンスで、これはいつも便利とは限りません。これを変換して str に簡単に変換できます。

In [15]: str(d)
Out[15]: '/home/kristina/desire-directory'