2017-06-06 76 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