如何在python中使用相同的子文件夹名称导入两个子模块

时间:2019-06-14 22:37:30

标签: python python-import

我的项目结构如下:

project/
  main.py
  sub_a/
    class_a.py
    __init__.py
    utils/
      __init__.py
      util_a.py
  sub_b/
    class_b.py
    __init__.py
    utils/
      __init__.py
      util_b.py

class_a.pyclass_b.py的每一个中,都有这样的导入:

from utils import util_a/b

我的PYTHONPATH指向sub_asub_b。当我尝试

import class_b

main.py中,我收到一个ImportError:

ImportError: cannot import name util_b

我正在使用Python 2.7。

我了解到错误是由于from utils import util_b含糊不清所致,因此Python选择了路径中的第一个,但是如何重写导入以使它们起作用?

我不认为更改PYTHONPATH是一个选择,因为sub_asub_b中的每一个都假定它们是PYTHONPATH中自己内部导入的一部分。例如,from utils import util_b中的class_b.py

2 个答案:

答案 0 :(得分:1)

不要将两个子目录都添加到PYTHONPATH中。相反,仅向其中添加project并导入sub_a.utils.util_asub_b.utils.utils_b
(在包本身中,您可以使用relative imports从同一子树中导入内容。例如,在sub_b/__init__.py中:import .utils.utils_b

根据isinstance fails for a type imported via package and from the same module directly,如果您添加子目录,则utils软件包将与sys.path上较早的软件包相关联,并且只要您尝试从{{ 1}}。

答案 1 :(得分:0)

您要查找的是“导入为”

很好的概述: 在另一个线程from ... import OR import ... as for modules'

中回答

从project.sub_a导入用户作为aUser

从project.sub_b导入用户为bUser