了解模块和绝对/相对包导入

时间:2019-04-04 10:44:03

标签: python python-3.x

我已经创建了一个包含子文件夹的软件包,并且我希望包括子软件包模​​块中的父模块

我尝试遵循此处https://docs.python-guide.org/writing/structure/所建议的项目结构,并尝试复制此处http://zetcode.com/lang/python/packages/所列出的分步过程,但是似乎我缺少有关python软件包系统的明显信息

这是我的项目结构

watches/
-- ...
-- watches/
---- __init__.py (empty)
---- Logger.py
---- main.py
---- db/
------ __init__.py (empty)
------ EntryPoint.py

Logger.py包含一个类:

class Logger:
   ...

我尝试从db/EntryPoint.py导入Logger.py的类和方法,如下所示:

from watches.Logger import Logger
class EntryPoint: 
   ...

然后,我想将main.py中的所有内容包装如下:

from db.EntryPoint import EntryPoint

if __name__ == "__main__":
    t = EntryPoint("local")

最后,当我尝试按照main.py的方式执行python3 main.py时(如您所知,我位于watches/watches目录中),我猜到了以下错误堆栈跟踪: / p>

Traceback (most recent call last):
  File "main.py", line 1, in <module>
    from db.EntryPoint import EntryPoint
  File "some/absolute/path/watches/watches/db/EntryPoint.py", line 4, in <module>
    from watches.Logger import Logger
ModuleNotFoundError: No module named 'watches'

1 个答案:

答案 0 :(得分:0)

每次导入都相对于脚本运行的位置(在您的情况下为main.py)。

因此,程序的观点是:

-logger.py
-__init__.py
-db/
---__init__.pt
---EntryPoint.py

程序不知道他是一个名为watchs的模块,因此,如果要在主程序中导入logger.py,只需执行以下操作:

from Logger import Logger

或将主目录移动到父文件夹。