我的项目是这样组织的:
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
我不知道我做错了什么。有人可以解释一下进口是如何运作的,我做得不对吗?
答案 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中的类的相对导入将起作用。那是缺失的一块