У меня очень простой пакет пространства имен: https://github.com/korommatyi/import-error-repro (я опишу макет каталога ниже).Если я пытаюсь импортировать namespace_repro.module
, я получаю следующую ошибку: AttributeError: module 'namespace_repro' has no attribute 'module'
.Насколько я понимаю, мой пакет имеет верный макет, и импорт должен работать.Интересно, что ошибка присутствует только в Python 3.6.8, а импорт завершается в Python 3.7.
Как воспроизвести проблему?
Я создал совершенно новую среду Python 3.6 conda conda create -n namespace6 python=3.6 ipython
, затем я активировал его и установил пакет как pip install -e ./import-error-repro
(обратите внимание, что -e
не имеет значения, проблема воспроизводима без него).После этого я попытался import namespace_repro.module
в ipython
(хотя то же самое происходит в официальном интерпретаторе Python).В результате получается
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-1-bcae5a697dad> in <module>
----> 1 import namespace_repro.module
~/namespace-repro/src/namespace_repro/module/__init__.py in <module>
----> 1 from namespace_repro.module.x import x
~/namespace-repro/src/namespace_repro/module/x.py in <module>
----> 1 import namespace_repro.module.y as y
2
3 x = y.y
AttributeError: module 'namespace_repro' has no attribute 'module'
---------------------------------------------------------------------------
Странно то, что система импорта дважды находит namespace_repro.module
, но в третий раз выдает ошибку!
Другое интересное поведение:
In [1]: import namespace_repro.module.y as y # This doesn't work.
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-4-4035347ea59b> in <module>
----> 1 import namespace_repro.module.y as y
AttributeError: module 'namespace_repro' has no attribute 'module'
In [2]: import namespace_repro.module.y # But this one does! Why?
In [3]: dir(namespace_repro.module.y) # The error returns when we actually want to use the module.
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-3-d89bcfd9e509> in <module>
----> 1 dir(namespace_repro.module.y)
AttributeError: module 'namespace_repro' has no attribute 'module'
In [4]: from namespace_repro.module.y import y # This works fine!
In [5]: y
Out[5]: True
Макет каталога
. import-error-repro
+-- setup.py
+-- src
| +-- namespace_repro
| | +-- module
| | | +-- __init__.py
| | | +-- x.py
| | | +-- y.py