文件层次结构和本地导入

File hierarchy and local imports

我正在尝试找出 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

从“项目 1”执行 run.py 将尝试从项目 2 导入“脚本”目录。

cannot import name 'variable' from 'scripts.settings' (/Users/.../dir/subdir/project2/scripts/settings.py)

从“项目 1”执行 run.py 时,从 project2/scripts 中删除 __init__.py 不再产生错误。

  1. 您是说:

I use relative imports for all files in the "scripts" directory.

from misc import x, y, z

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

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