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

问题描述 投票:0回答:1

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

我试图遵循这里建议的项目结构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目录,你可以猜到),我guet以下错误堆栈跟踪:

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'
python python-3.x
1个回答
0
投票

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

因此,您的计划的观点是:

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

程序不知道他是一个名为watches的模块,所以如果你想在你的main中导入logger.py,只需执行:

from Logger import Logger

或者将您的主页移动到父文件夹。

© www.soinside.com 2019 - 2024. All rights reserved.