【问题标题】:Understanding module & absolute / relative package imports了解模块和绝对/相对包导入
【发布时间】:2019-04-04 18:58:12
【问题描述】:

我创建了一个包含子文件夹的包,我希望包含来自子包模块的父模块

我已尝试遵循此处建议的项目结构 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")

最后,当我尝试按照python3 main.py 执行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'

【问题讨论】:

  • from ..Logger import Logger.
  • 您不应该从包本身的内部执行模块。试试python3 watches/main.py。或者,可能更好,将其作为模块执行:python3 -m watches.main.

标签: python python-3.x


【解决方案1】:

每次导入都将与运行脚本的位置相关,在您的情况下为 main.py。

所以,你的程序的观点是:

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

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

from Logger import Logger

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

【讨论】:

    猜你喜欢
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    相关资源
    最近更新 更多