如何在 python 3.6 中处理 "flat" 相对导入?

How to handle "flat" relative imports in python 3.6?

既然有这么多关于相对进口的问题,我会尽量简短。是的,我读过“Relative imports for the billionth time”。

我有一个这样的项目结构:

.
├── Makefile
└── src
    ├── __init__.py
    ├── model
    │   └── train_model.py
    └── preprocessing
        └── process.py

例如,我希望能够调用 make preprocessingmake train,然后使用

运行 process.pytrain_model.py
## Make train
train:
    python3 src/model/train_model.py

例如模块将始终来自 Makefile 所在的顶级项目文件夹。

现在,我的问题是我可能在不同的子模块之间存在依赖关系,例如 train_model.pyprocess.py。具体来说,如果我尝试使用 from src.preprocessing import processtrain_model 中导入 process,我会得到一个错误 ImportError: No module named 'src'。同样,我尝试了 from ...preprocessing import process,这给了我另一个错误:SystemError: Parent module '' not loaded, cannot perform relative import.

我在 train_model.py 的末尾使用 if __name__ == '__main__':,但我似乎无法弄清楚 python 如何使用 __name__ 来查找不同的模块,如果这个 f**** 过程中出现问题。

使用PYTHONPATH。我会这样做:

生成文件:

export PYTHONPATH=$(abspath src)

train:
    python3 src/model/train_model.py

train_model.py:

from preprocessing import process

现在每次导入都会先在 src 下查找。写 from src.preprocessing import process 是不常规的——通常导入被理解为在一些基本目录中(你不会想将 PYTHONPATH 设置到 src 之上的目录,因为它可能包含东西你不想导入)。