2017-01-15 80 views
2

我目前在做一個個人編碼項目,我想建立一個模塊,但我不知道爲什麼我的結構不上班的路上它應該:自定義Python模塊結構

\mainModule 
    __init__.py 
    main.py 
    \subModule_1 
     __init__.py 
     someCode_1.py 
     someCode_2.py 
    \subModule_2 
     __init__.py 
     otherCode.py 

我希望能夠從main.py運行下面的代碼:

>>> from subModule_1 import someCode_1 
>>> someCode_1.function() 
"Hey, this works!" 
>>> var = someCode_2.someClass("blahblahblah") 
>>> var.classMethod1() 
>>> "blah blah blah" 
>>> from subModule2 import otherCode 
>>> otherCode("runCode","#ff281ba0") 

然而,當我嘗試導入someCode_1,例如,它返回一個AttributeError,我真的不知道爲什麼。它與__init__.py文件有關嗎?

修訂

  • 最小的,完整的和可覈查的(我希望...)

    \mainDir 
        __init__.py # blank file 
        main.py 
        \subDir 
         __init__.py # blank file 
         codeFile.py 
    

    使用此...

    #main.py file 
    import subDir 
    subDir.codeFile.function() 
    

    這...

    #codeFile.py file 
    def function(): 
        return "something" 
    

    ...它返回上面提到的同樣的問題**。

**確切的錯誤是:

Traceback (most recent call last): 
    File "C:\...\mainDir\main.py", line 2, in <module> 
    subDir.codeFile.function() 
AttributeError: module 'subDir' has no attribute 'codeFile' 

貸@jonrsharpe:謝謝你向我展示如何正確使用堆棧溢出。

+2

請提供[MCVE。另外你似乎在說你想從'main.py'「*中運行一個交互式會話*,這並不完全合理。 – jonrsharpe

+1

可能是由導入時執行的'someCode_1'中的某些模塊級代碼引起的。確切的錯誤信息是什麼? – schwobaseggl

+0

@jonrsharpe對不起,我的意思是使用解釋器編譯並運行'main.py'(對不起,菜鳥錯誤) – BUZZYSIN

回答

1

有兩個選項可以使這項工作。

無論是這樣的:

from subdir import codeFile 
codeFile.function() 

或者:

import subdir.codeFile 
subdir.codeFile.function() 
+0

是的,這工作正常,謝謝 – BUZZYSIN

1

當你import subDir,它做了三兩件事:

  1. 執行mainDir/subDir/__init__.py的代碼(即在這種情況下,什麼也不做,因爲這個文件是空的)
  2. subDir下的進口所產生的模塊本地,這又將其作爲mainDir模塊的屬性;
  3. sys.modules字典中全局註冊新的導入(因爲import正在從父模塊mainDir執行,因此此註冊的目的名稱已完成爲'mainDir.subDir');

它所做的做的,因爲它沒有被告知,是進口subDir.codeFile。因此,codeFile.py中的代碼尚未運行,名稱codeFile尚未導入到mainDir.subDir的名稱空間中。因此當試圖訪問它時AttributeError。如果您要添加以下行至mainDir/subDir/__init__.py那麼它會工作:

import codeFile 

具體來說,這將:

  1. 運行codeFile.py
  2. 的代碼添加所產生的模塊的屬性mainDir.subDir模塊
  3. 存儲對sys.modules的另一個條目的引用,此時名稱爲mainDir.subDir.codeFile

你也可以實現從高了模塊的層次結構相同的效果,說import subDir, subDir.codeFile,而不是僅僅import subDirmainDir.main源文件。

注意:當你在命令行或IDE進行測試,確保您的當前工​​作目錄(os.getcwd()查詢,使用os.chdir(wherever)改變)既不是mainDir也不subDir。從其他地方工作 - 例如。 mainDir的父目錄。在模塊內部工作會導致意想不到的結果。

+0

這非常有道理 - 我現在正在修改它以使其正常工作(我不知道導入關鍵字是如何工作的,但是這爲我清除了很多煙霧) – BUZZYSIN

+0

問題 - 如果我不想要讓我當前的工作目錄是'main.py'(你準確猜測它會是),「我會在哪裏運行解釋器?它甚至是_matter_? – BUZZYSIN

+0

不幸的是,我將'import codeFile'放入'mainDir \ subDir \ __ init __。py'中時出現錯誤:'ModuleNotFoundError:No module named'codeFile'' – BUZZYSIN