python - 了解模块和绝对/相对包导入
问题描述
我创建了一个包含子文件夹的包,我想包含一个子包模块中的父模块。
我尝试遵循此处建议的项目结构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'
解决方案
每个导入都将相对于运行脚本的位置,在您的情况下,main.py。
因此,您的程序的观点是:
-logger.py
-__init__.py
-db/
---__init__.pt
---EntryPoint.py
该程序不知道他是一个名为watches的模块,因此如果您想在main中导入logger.py,只需执行以下操作:
from Logger import Logger
或将您的主文件夹移至父文件夹。
推荐阅读
- javascript - 将 Promise 挂起为变量中的值
- angular8 - 排序不适用于虚拟滚动自定义数据源
- node.js - VM 上的 Cosmos DB 模拟器和主机 MacOS 上的 Azure Function App 未通过 SSL 验证
- android - 更新了 android studio 中的依赖版本警告
- swift - 如何获取自定义形状的 .onHover(...) 事件
- r - 带有连字符的 eval 解析字符串返回错误对象“顶部:”未找到
- sql - 访问查询 - 使用条件获取最新日期
- java - 如何使用java在android中绘制带有圆角矩形的QR码?
- azure-active-directory - Microsoft Graph API v1.0 自助服务重置密码丢失
- mysql - MySQL 方法 SUM()