2010-12-27 19 views
28

"ClassA"と呼ばれるPythonクラスと "ClassB"であるClassAをインポートする別のPythonクラスがあります。次のようなディレクトリ構造は次のとおりです。兄弟ディレクトリからインポート

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

ClassBのはにClassAを使用できるように、どのように私はsys.path使うのでしょうか?

+2

とgoogleable材料とSOの質問のかなりのビットを持っていますparentdirを取得する Aより安全な方法は、検査モジュールを介してです。 – delnan

+0

http://stackoverflow.com/questions/279237/python-import-a-module-from-a-folder – jgritty

答えて

16

あなたは本当にパッケージを使用する必要があります。その後MAINDIR(例えば... /のsite-packages)のsys.path上のファイルシステム内のポイントに設置され、その後、あなたはClassBので言うことができます:

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

あなただけのそれぞれにおける__init__.pyという名前のファイルを配置する必要がありますディレクトリをパッケージ階層にします。 「親ディレクトリからPythonのインポート」質問への答えとしてリテラル

+0

sys.pathにMainDirを追加してあなたのソリューションを試しましたが、MainDir.Dir.DirAという名前のモジュールはなく、__init __。pysすべてのディレクトリにあります。 – skylerl

+3

MainDirを追加せず、親ディレクトリを追加します。 MainDirを追加した場合(それがパッケージルートでない場合は、これは問題ありません)、代わりに 'Dir.DirA import ClassA'のようにインポートしてください。 – Keith

21

あなたは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 
+5

これはパッケージ内にある場合のみ機能しますか? – skylerl

+4

@ Yakattak:はい、しかし、とにかくパッケージに入っていなければなりません;) – delnan

+0

これは最も簡単で簡単な答えのようです。 –

44

あなたの現在のモジュールの親ディレクトリにある 『のmymodule』をインポートする:

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

編集 残念ながら__file__属性は設定されていません。それは相対的な輸入を呼ばれています

import inspect 
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) 
parentdir = os.path.dirname(currentdir) 
+0

これは私を助けました。 – odigity

+0

Remi - 文字通りの答えをありがとう。私はこれがPythonアプリケーションのテストコードを書くときに便利だとわかりました。私はサブディレクトリにテストコードを置くことができ、既存のプロジェクトを変更せずにテストを実行することができます。 (言い換えれば、既存のコードをモジュールに変換してからテストを実行するのは、バグを作業コードに導入するリスクを管理するという観点からは不適切です)モジュールパスを変更する方法は便利です。 –

+0

それだけで動作する唯一のものです、ありがとう! –

関連する問題