2017-09-12 38 views
0

嗨,我是新來的python,並認爲我與我建立的程序結構有問題。關於解決導入錯誤的結構建議

這是我想到的結構的摘錄。

. 
└── 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

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) 

現在,如果我要運行asd.py我收到以下錯誤:

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

如果我在importer.py中運行測試代碼,我得到這個錯誤:

ImportError: cannot import name 'asd' 

其他主題如ImportError: Cannot import name X建議我有循環依賴進口。

那麼我該如何解決這個問題,但要保持行爲,每個類都可以與asd的實例進行通信?

編輯0: 我加入

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

你有你的路徑上的'asd'目錄,而不是'asd'的*父目錄*。所以'asd.py'被認爲是一個頂級模塊,而不是目錄。 –

+0

您是否使用'asd.py'作爲腳本?如果是這樣,不要。您不能將一個文件作爲腳本運行,因爲這會立即成爲路徑上的頂級目錄。將腳本*放在*包之外,或者使用'python -m'開關將模塊作爲腳本運行(具有'__main __。py'模塊的包可以使用該方法執行)。 –

+0

這裏有太多叫做「asd」的東西。 –

回答

0

對於任何人誰具有同樣的問題開始asd.pyimporter.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