web-dev-qa-db-ja.com

兄弟ディレクトリからインポート

Python「ClassA」と呼ばれるクラスと、別のPython「ClassB」であるClassAをインポートするクラス。ディレクトリ構造は次のとおりです。

MainDir
../Dir
..../DirA/ClassA
..../DirB/ClassB

ClassBがClassAを使用できるようにsys.pathを使用するにはどうすればよいですか?

32
skylerl

あなたは本当にパッケージを使うべきです。次に、MainDirがsys.path上のファイルシステムのポイント(たとえば.../site-packages)に配置され、ClassBで次のように言えます。

from MainDir.Dir.DirA import ClassA # which is actually a module

__init__.pyという名前のファイルを各ディレクトリに配置するだけで、パッケージ階層になります。

17
Keith

質問に対する文字通りの答えとして、親ディレクトリからのPythonインポート':

現在のモジュールの親ディレクトリにある「mymodule」をインポートするには:

import os
parentdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
os.sys.path.insert(0,parentdir) 
import mymodule

編集する 残念ながら、__file__属性は常に設定されているわけではありません。 parentdirを取得するより安全な方法は、検査モジュールを使用することです。

import inspect
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
parentdir = os.path.dirname(currentdir)
47
Remi

relative import (リンクの例、現在のモジュール-A.B.C):

from . import D                 # Imports A.B.D
from .. import E                # Imports A.E
from ..F import G               # Imports A.F.G
25
crazylammer