わかりました...モジュールx
がどこにあるかわかりませんが、2レベル上のディレクトリへのパスを取得する必要があることは知っています。
だから、もっとエレガントな方法があります:
import os
two_up = os.path.dirname(os.path.dirname(__file__))
Python 2および3の両方のソリューションを歓迎します!
pathlib
を使用できます。残念ながら、これはPython 3.4のstdlibでのみ利用可能です。古いバージョンを使用している場合、PyPI here からコピーをインストールする必要があります。これはpip
を使用して簡単に実行できるはずです。
from pathlib import Path
p = Path(__file__).parents[1]
print(p)
# /absolute/path/to/two/levels/up
これは、parents
シーケンスを使用して、親ディレクトリへのアクセスを提供し、2番目のシーケンスを選択します。
この場合のp
は、独自のメソッドを持つ何らかの形式のPath
オブジェクトになります。文字列としてのパスが必要な場合は、それらでstr
を呼び出すことができます。
非常に簡単:
欲しいものは次のとおりです。
import os.path as path
two_up = path.abspath(path.join(__file__ ,"../.."))
よろしくセビ
私はこれをばかげているだけでなく、新人にエイリアス関数やインポートの潜在的な有用性を示すために追加するつもりでした。
それを書いた後、このコードはこれまでの他の答えよりも読みやすく(つまり、意図を把握する時間が短い)、読みやすさが(通常)王様だと思います。
from os.path import dirname as up
two_up = up(up(__file__))
注:モジュールが非常に小さい場合、または文脈的にまとまりがある場合にのみ、この種のことを行います。
ディレクトリ2のレベルを上げるには:
import os.path as path
two_up = path.abspath(path.join(os.getcwd(),"../.."))
任意のディレクトリから実行する場合の最適なソリューション(python> = 3.4の場合)は次のとおりです。
from pathlib import Path
two_up = Path(__file__).resolve().parents[1]
個人的には、osモジュールを使用することが、以下に概説する最も簡単な方法であることがわかりました。 1レベルだけ上がる場合は、( '../ ..')を( '..')に置き換えます。
import os
os.chdir('../..')
--Check:
os.getcwd()
2.7.xでは以下がうまく機能することがわかりました。
import os
two_up = os.path.normpath(os.path.join(__file__,'../'))
これを一般的なソリューションとして使用できます。
import os
def getParentDir(path, level=1):
return os.path.normpath( os.path.join(path, *([".."] * level)) )
より多くのクロスプラットフォーム実装は次のようになります:
import pathlib
two_up = (pathlib.Path(__file__) / ".." / "..").resolve()
parent
の使用は、Windowsではサポートされていません。 .resolve()
も追加する必要があります:
パスを絶対にし、途中ですべてのシンボリックリンクを解決し、それを正規化する(たとえば、Windowsでスラッシュをバックスラッシュに変換する)