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
。
谢谢!
谢谢你的建议!你能解释为什么会发生这种情况吗?为什么“从......进口......”起作用,“进口......作为...”不? –
文件foo1.foo2.foo3.bar1不属于我,我无法更改它。我只是更新foo1.foo2.__init__.py。 –
@ Pro.Hessam其实我不确定。但它似乎在子模块中的同一文件夹中导入文件,您需要指定范围。这意味着你需要使用'from。 import bar2'或'from foo1.foo2.foo3 import bar2'。你需要指定模块'foo3'的范围,其原因可能与'bar1'有关,'bar2'只是一个文件而不是一个模块。 – Sraw