2017-06-06 80 views
1

我正在導入軟件包foo1.foo2,其中__init__.py正在導入子模塊foo1.foo2.foo3.bar1,它是一個文件。如果我嘗試導入該文件我得到以下錯誤內:正在加載軟件包時導入軟件包的子模塊

AttributeError: module 'foo1' has no attribute 'foo2' 

鑑於the use of relative imports is discouraged,我怎麼能解決這個問題,而使用相對進口?


這裏是我的包結構和文件內容:

/ 
├── foo1 
│   ├── __init__.py: 
│   └── foo2 
│    ├── __init__.py: "import foo1.foo2.foo3.bar1" 
│    └── foo3 
│     ├── __init__.py 
│     ├── bar1.py: "import foo1.foo2.foo3.bar2 as bar2" 
│     └── bar2.py: 
└── main.py: "import foo1.foo2" 

運行python main.py生成以下錯誤:

Traceback (most recent call last): 
    File "main.py", line 1, in <module> 
    import foo1.foo2 
    File "/foo1/foo2/__init__.py", line 1, in <module> 
    import foo1.foo2.foo3.bar1 
    File "/foo1/foo2/foo3/bar1.py", line 1, in <module> 
    import foo1.foo2.foo3.bar2 as bar2 
AttributeError: module 'foo1' has no attribute 'foo2 

我使用Python 3.6.0 :: Anaconda 4.3.1

謝謝!

回答

1

import foo1.foo2.foo3.bar2 as bar2更改爲from foo1.foo2.foo3 import bar2

然後它工作。

+0

謝謝你的建議!你能解釋爲什麼會發生這種情況嗎?爲什麼「從......進口......」起作用,「進口......作爲...」不? –

+0

文件foo1.foo2.foo3.bar1不屬於我,我無法更改它。我只是更新foo1.foo2.__init__.py。 –

+0

@ Pro.Hessam其實我不確定。但它似乎在子模塊中的同一文件夾中導入文件,您需要指定範圍。這意味着你需要使用'from。 import bar2'或'from foo1.foo2.foo3 import bar2'。你需要指定模塊'foo3'的範圍,其原因可能與'bar1'有關,'bar2'只是一個文件而不是一個模塊。 – Sraw