2011-11-05 112 views
2

目錄結構:導入父模塊包

[app] 
    start.py 
     import package1 
    [package1] 
     __init__.py 
      print('Init package1') 
      import module1 
      import subpackage1 
     module1.py 
      print('package1.module1') 
      import package1 # this works OK 
     [subpackage1] 
      __init__.py 
       print('Init package1.subpackage1') 
       import module1 
      module1.py 
       print('Init package1.subpackage1.module1') 
       #from package1 import subpackage1 # ImportError: cannot import name subpackage1 
       #from .. import subpackage1 # ImportError: cannot import name subpackage1 
       #import . as subpackage1 # SyntaxError: invalid syntax 
       import package1.subpackage1 as subpackage1 # AttributeError: 'module' object has no attribute 'subpackage1' 

爲了避免subpackage1.module1我想導入模塊subpackage1爲了參考其他模塊從subpackage1在形式subpackage.module2引起圓形進口問題。因爲如果我做from . import module2module2的引用可能還不存在subpackage1當我嘗試此導入。

我已經嘗試了4種不同的方法 - 它們都沒有工作 - 請參閱代碼中的註釋。

任何幫助?

前段時間subpackage1是頂層包,它的工作(見它是如何工作在package1.module1源現在,當我把它降一個級別 - 我有這個問題......我知道,我可以補充包1 DIR到sys.path,但是這是醜陋的。

+0

你正在嘗試創建一個循環導入本身。 –

回答

1

我用這個工具,它爲我工作:

#import package1.subpackage1 as subpackage1 # AttributeError: 'module' object has no attribute 'subpackage1' 
subpackage1 = sys.modules[__name__.rpartition('.')[0]] # parent module 

或者你可以試試這個:

from package1 import subpackage1 

在某些情況下有效:https://stackoverflow.com/a/24968941/248296

1

我不是不完全知道你正在嘗試做的,但你的例子可能是一個更容易理解,如果你使用的絕對導入,避免把代碼__init__模塊。

嘗試類似的:

[app] 
    start.py 
     print('Start') 
     from package1 import module1 
    [package1] 
     __init__.py 
      print('Init: package1') 
     module1.py 
      print('Load: package1.module1') 
      from package1.subpackage1 import module1 
     [subpackage1] 
      __init__.py 
       print('Init: package1.subpackage1') 
      module1.py 
       print('Load: package1.subpackage1.module1') 
       from package1 import subpackage1 

運行start.py後,你應該得到的輸出是這樣的:

Start 
Init: package1 
Load: package1.module1 
Init: package1.subpackage1 
Load: package1.subpackage1.module1 
+0

感謝您的迴應,但我需要從'module1'中導入一些名稱以將它們暴露在'​​subpackage1 .__ init__'中。另外我導入模塊'subpackage1 .__ init__',因爲'subpackage1'中有幾個模塊,我需要按照一定的順序導入它們。 – warvariuc

+0

@warvariuc。一般來說,應該避免將代碼放在'__init__'模塊中。需要以特定順序導入模塊也有不良的代碼味道。這聽起來像你需要分開你的模塊,以便更高效地在模塊之間共享功能。 – ekhumoro

+0

我想做得更好,但不知道如何。至於'__init__'中的代碼,經常會看到在其他項目中使用的代碼 - (例如scrapy)。否則,爲什麼你需要'__init__'呢? – warvariuc