我试图理解Python的导入结构并创建了以下内容:
+-- prj
| +-- __init__.py
| +-- /moda
| | +-- __init__.py
| | +-- fa.py
| +-- /prja
| | +-- __init__.py
| | +-- prjf.py
| +-- /web
| | +-- __init__.py
| | +-- page.py
|
fa.py
from prj.web import page
print("fa")
prjf.py
from prj.moda import fa
from .moda import fa
print(dir(prj))
print('prj')
page.py
print("page")
然而,跑步:
$pwd
/home/user/test/prj
$ python prja/prjf.py
我得到了
Traceback (most recent call last):
File "prja/prjf.py", line 1, in <module>
from prj.moda import fa
File "/home/user/test/prj/prja/prj.py", line 1, in <module>
ImportError: cannot import name prj
但是自官方python以来,这没有任何意义 docs明确说明
当包被组织成子包时(与示例中的声音包一样),您可以使用绝对导入来引用兄弟包的子模块。例如,如果模块sound.filters.vocoder需要在sound.effects包中使用echo模块,它可以使用sound.effects import echo。
另外如果在prjf中我先把相对导入我得到
Traceback (most recent call last):
File "prja/prjf.py", line 1, in <module>
from .moda import fa
ValueError: Attempted relative import in non-package
虽然预期结果不是这样的包moda
它是默认的ubuntu上的默认python3安装