我的项目根文件夹中没有名为“xxx”的模块

时间:2016-09-16 23:16:05

标签: python python-3.x import

我的项目是这样组织的:

ezrename/
├── base/
├── Images/
└── shell

ezrename,base和shell文件夹中有空的 init .py文件。图像只是一个资源文件夹,没有任何内容。

我有一个名为ezrename / base / colors.py文件的模块,它实现了Colors类。

我有一个名为ezrename / shell / baseshell.py的模块,它实现了BaseShell类并导入了颜色。

  

来自ezrename.base导入颜色

但是我收到以下错误:

Traceback (most recent call last):
  File "/home/devaneando/Development/ezrename/shell/baseshell.py", line 6, in <module>
    from ezrename.base import Colors
ImportError: No module named 'ezrename'

所以我决定尝试

from ..base import Colors

获取

Traceback (most recent call last):
  File "/home/devaneando/Development/ezrename/shell/baseshell.py", line 6, in <module>
    from ..base import Colors
SystemError: Parent module '' not loaded, cannot perform relative import

我不知道我做错了什么。有人可以解释一下进口是如何运作的,我做得不对吗?

3 个答案:

答案 0 :(得分:0)

Python导入将作为项目的根目录工作,因此子目录中模块中的任何导入都应该相对于

导入

因此,如果您从ezrename /中的主模块运行,那么basehell.py中的导入应为:

from base import colors

答案 1 :(得分:0)

您可以将ezrename / base添加到python路径,然后只需导入Colors

e.g。来自ezrename / shell / baseshell.py

import os
import sys
shell_dir = os.path.dirname(os.path.realpath(__file__))
ezrename_dir = os.path.dirname(shell_dir)
base_dir = os.path.join(ezrename_dir, "base")
sys.path.append(base_dir)
import Colors

答案 2 :(得分:0)

通过pythonic方式,我认为我的想法是错误的。您无法按照我的意愿从两个模块导入,因为只有在未导入模块本身的情况下导入才能正常工作。

pythonic方法是创建一个没有 init .py文件的应用程序文件夹,在应用程序入口脚本中导入包,相关导入将起作用:

EzRename
└──ezrename/
    ├── base/
    ├── Images/
    └── shell

在EzRename中,添加application.py:

  

导入ezrename

如果这样做,shell和base中的类的相对导入将起作用。那是缺失的一块