【发布时间】:2020-12-29 18:50:11
【问题描述】:
我正在尝试找出 python3 中的文件层次结构和本地导入。我遇到了以下文件结构的问题:
└── project
├── run.py
└── scripts
├── __init__.py
├── misc.py
├── script1.py
└── script2.py
我对“脚本”目录中的所有文件使用相对导入。
from misc import x, y, z
我在run.py 中使用绝对导入。
from scripts.misc import a, b, c
from scripts.script1 import more_stuff
我的目标是让 python 文件独立且功能齐全。但是,当我尝试执行run.py 时,我遇到了错误。
from misc import x, y, z
ModuleNotFoundError: No module named 'misc'
我希望相对路径是相对于原始文件的,而不是采用执行文件的路径。我可以通过修改导入或文件结构来解决这个问题吗?
看来我也不明白__init__.py 的工作原理。我想重新使用通用包名称(如“脚本”)。我曾假设__init__.py 文件将在相对于已执行文件的下游立即读取:如果执行run.py,则仅应考虑同一级别的脚本目录。我发现一个遥远的(不相关的?)“脚本”目录获得优先权。这是否可以通过更谨慎的绝对路径来解决?下面的例子。
└── dir
└── project1
| ├── run.py
| └── scripts
| ├── __init__.py
| └── settings.py
└── subdir
└── project2
├── run.py
└── scripts
├── __init__.py
└── settings.py
从 "project1" 执行 run.py 将尝试从 project2 导入 "scripts" 目录。
cannot import name 'variable' from 'scripts.settings' (/Users/.../dir/subdir/project2/scripts/settings.py)
从 project2/scripts 中删除 __init__.py 在从 "project1" 执行 run.py 时不再产生错误。
【问题讨论】:
标签: python-3.x import hierarchy