首页 > 解决方案 > 了解模块和绝对/相对包导入

问题描述

我创建了一个包含子文件夹的包,我想包含一个子包模块中的父模块

我尝试遵循此处建议的项目结构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您可以猜到的目录中),我得到以下错误堆栈跟踪:

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'

标签: pythonpython-3.x

解决方案


每个导入都将相对于运行脚本的位置,在您的情况下,main.py。

因此,您的程序的观点是:

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

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

from Logger import Logger

或将您的主文件夹移至父文件夹。


推荐阅读