文件层次结构和本地导入

时间:2020-12-29 18:50:11

标签: python-3.x import hierarchy

我正在尝试找出 python3 中的文件层次结构和本地导入。我遇到了以下文件结构的问题:

└── project
    ├── run.py
    └── scripts
        ├── __init__.py
        ├── misc.py
        ├── script1.py
        └── script2.py

我对“scripts”目录中的所有文件使用相对导入。

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 时不再产生错误。

1 个答案:

答案 0 :(得分:1)

  1. 你是说:
<块引用>

我对“scripts”目录中的所有文件使用相对导入。

从杂项导入 x, y, z

但这不是相对的。对于亲戚,你需要有

from .misc import x, y, z
  1. 要了解为什么不相关的脚本优先,请查看您的 sys.path 并验证它是否确实位于您的脚本包之前。我可以假设这是 ide 路径操作的一些剩余部分。