2017-09-12 6 views
0

こんにちは私はPythonには新しく、私が構築したプログラム構造に問題があると思います。ImportErrorsを解決するための構造に関する助言

これは私が考えた構造の抽出物です。

. 
└── asd 
    ├── asd.py 
    ├── __init__.py 
    ├── Framework 
    │   ├── importer.py 
    │   └── __init__.py 
    ├── Library 
    │   ├── libraryManager.py 
    │   └── __init__.py 

実際にはasdの下にさらに多くのパッケージがあります。 asd.pyは「メイン」を意味します。他のパッケージに含まれる異なるクラスの多くのオブジェクトをインスタンス化します。たとえば、いくつかのlibraryManagerオブジェクトがあります。インポータは、ライブラリファイルをインポートするだけでなく、インポートすることもできます。

私の主な欠陥は次のとおりです。異なるパッケージ内のクラスがasdの各インスタンスにアクセスできるようにするには、メインasdへの参照をパラメータとして取得します。 これらは、問題のファイルです:

asd.py

from asd.Framework.importer import importer 
from asd.Library.libraryManager import libraryManager 
class asd(object): 

    def __init__(self): 
     # instantiate several objects 
     self.nodeLibMng = libraryManager("DbNodeLibrary.txt") 
     self.importer = importer(self) 

importer.py:私はasd.pyを実行したい場合は

from asd.asd import asd 
class importer(object): 

    def __init__(self, asdRef : asd): 
     self.asdRef = asdRef 

    def importNode (self,item): 
     # The following line shows why I want this reference construct. 
     self.asdRef.nodeLibMng.appendItemToLibraryDB(item) 

は今、私は次のエラーを取得する:

ImportError: No module named 'asd.Framework'; 'asd' is not a package 

私がimporter.py I内でテストコードを実行するとこのエラーが出る:ImportError: Cannot import name Xよう

ImportError: cannot import name 'asd' 

他のトピックは、私は、円形の依存輸入を持っていることを示唆しています。

どのように私はこれを解決することができますが、すべてのクラスはasdのインスタンスと通信することができますか?

EDIT 0: 私は同じ問題を持っている誰のために

if __name__ == '__main__': 
    asd=asd() 
+1

あなたは、あなたのパスに 'asd'のではない*親ディレクトリの*を' asd'ディレクトリを持っています。したがって、 'asd.py'はディレクトリではなくトップレベルのモジュールとして見つけられます。 –

+0

'asd.py'をスクリプトとして使用していますか?もしそうなら、しないでください。パッケージ内の単一のファイルをスクリプトとして実行することはできません。これは、すぐにパス上の最上位ディレクトリになるためです。スクリプト*外部パッケージを置くか、 'python -m'スイッチを使ってモジュールをスクリプトとして実行します(' __main __。py'モジュールを持つパッケージはそのメソッドを使って実行できます)。 –

+0

ここには "asd"と呼ばれるものが非常にたくさんあります。 –

答えて

0

追加することにより、asd.pyまたはimporter.pyを始めている:私は単に参照と信頼の入力タイプの仕様を放棄し を自分自身と他の人に正しい参照を与えるように指示します。さらに、私はtry: except:ブロックの参照へのすべてのアクセスをラップしました。したがって、上記の例では

class importer(object): 
    # compare to the previous def __init__(self, asdRef : asd): 
    def __init__(self, asdRef): 
     self.asdRef = asdRef 

    def importNode (self,item): 
     # The following line shows why I want this reference construct. 
     try: 
      self.asdRef.nodeLibMng.appendItemToLibraryDB(item) 
     except: 
      raise 
関連する問題