从不同包导入时出现相对导入错误

Relative import error when importing from different package

我的项目结构是这样的-

<project_name>

--Makefile
--src
  -- __init__.py
  -- utils
     -- __init__.py
     -- general_imports.py
        -- variable named X
  -- modelling
     -- train.py
  

我的 train.py 模块看起来像这样 -

import sys

sys.path.insert(0,'../../src/')

from utils.general_imports import *


print("Value of X is ",X)

现在,如果我 运行 目录 train.py 中的代码存在,这就可以正常工作,但我不希望那样。我想制作一个食谱,这样它就可以从根目录级别 运行,像这样 -

make train

请注意 Makefile 位于项目根目录中。

当我尝试从根级别 运行 我的 train.py 时 - python src/modelling/train.py,它给我错误 - ModuleNotFoundError: 没有名为 'src/modelling/train'.

的模块

为了克服这个问题,我尝试像这样编辑路径 -- sys.path.insert(0,'../../../<project_name>') 并且也在根级别添加空的 __init__.py,但这似乎也不起作用。

有人可以帮忙吗?另外,请提出任何更好的方法来实现这一目标。

P.S:如果可能的话,我不想绕过 add/modify PYTHONPATH。

中删除 sys.path hack 和 __init__.py,然后从 中删除 运行 您的脚本,如:

python -m src.modelling.train

这是 运行 脚本的正确方法(从根包的父目录,在您的例子中是 src)。导入应该以这种方式工作,但当 运行 从其包中调用脚本时,您应该避免这样做