web-dev-qa-db-ja.com

上のディレクトリにあるPythonクラスをインポートする方法は?

現在のディレクトリより上のディレクトリにあるファイルのクラスを継承したい。

そのファイルを比較的インポートすることは可能ですか?

169
user129975

import statement docが示すように、パッケージ階層内で2つのドットを使用します。

インポートするモジュールを指定する場合、モジュールの絶対名を指定する必要はありません。モジュールまたはパッケージが別のパッケージに含まれている場合、パッケージ名を指定せずに、同じトップパッケージ内で相対的なインポートを行うことができます。 fromの後に指定されたモジュールまたはパッケージの先頭のドットを使用することにより、正確な名前を指定せずに現在のパッケージ階層を上に移動する高さを指定できます。 1つの先頭のドットは、インポートを行うモジュールが存在する現在のパッケージを意味します。 2つのドットは、1つ上のパッケージレベルを意味します。 3つのドットは2レベル上にあります。したがって、pkgパッケージのモジュールからfrom . import modを実行すると、pkg.modをインポートすることになります。 from ..subpkg2 import mod内からpkg.subpkg1を実行すると、pkg.subpkg2.modをインポートします。相対的なインポートの仕様は、 PEP 328 に含まれています。

PEP 328 絶対/相対インポートを処理します。

160
gimel
import sys
sys.path.append("..") # Adds higher directory to python modules path.
94
Sepero

@gimelの答えは正しいですif彼が言及したパッケージ階層を保証できます。できない場合-あなたの本当のニーズがあなたが表現したとおりで、ディレクトリに排他的に関連付けられており、パッケージングとの必要な関係がない場合-あなたは親ディレクトリを見つけるために__file__に取り組む必要がありますof os.path.dirnameの呼び出しが行われます;-)、その後(そのディレクトリがsys.pathにない場合)、sys.path__import__の先頭に、上記のディレクトリを一時的に追加します。前述のディレクトリを削除します-本当に面倒な作業ですが、「あなたがしなければならないとき、あなたはしなければなりません」(そしてPyhonは、プログラマーが must ISO C規格は、序文の「Cの精神」セクションで述べています!-)。

以下があなたに役立つかもしれない例です:

import sys
import os.path
sys.path.append(
    os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir)))

import module_in_parent_dir
70
Alex Martelli

現在のディレクトリの1つ上のレベルにあるディレクトリからモジュールをインポートします。

from .. import module
31
Sepero