如何在 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 preprocessing
或 make train
,然后使用
运行 process.py
或 train_model.py
## Make train
train:
python3 src/model/train_model.py
例如模块将始终来自 Makefile 所在的顶级项目文件夹。
现在,我的问题是我可能在不同的子模块之间存在依赖关系,例如 train_model.py
和 process.py
。具体来说,如果我尝试使用 from src.preprocessing import process
在 train_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
之上的目录,因为它可能包含东西你不想导入)。
既然有这么多关于相对进口的问题,我会尽量简短。是的,我读过“Relative imports for the billionth time”。
我有一个这样的项目结构:
.
├── Makefile
└── src
├── __init__.py
├── model
│ └── train_model.py
└── preprocessing
└── process.py
例如,我希望能够调用 make preprocessing
或 make train
,然后使用
process.py
或 train_model.py
## Make train
train:
python3 src/model/train_model.py
例如模块将始终来自 Makefile 所在的顶级项目文件夹。
现在,我的问题是我可能在不同的子模块之间存在依赖关系,例如 train_model.py
和 process.py
。具体来说,如果我尝试使用 from src.preprocessing import process
在 train_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
之上的目录,因为它可能包含东西你不想导入)。