【问题标题】:Importing a common package from two other packages (python3)从其他两个包中导入一个通用包(python3)
【发布时间】:2018-03-31 03:21:11
【问题描述】:

我是 Python 包的新手,我正在努力让某些东西正常工作。 我有 3 个包:engineuidb。我想在其他两个包中使用db。这样做的正确方法是什么?

我不想安装db 包,因为我目前正在同时开发这 3 个包。

谢谢!


目前,我正在尝试通过导入同级包来做到这一点,但这太糟糕了,我不确定这是不是正确的做法。 这个问题与Relative imports in Python 3ValueError: attempted relative import beyond top-level package 等大量问题密切相关,但没有一个对我来说是有效的、有效的答案:-(

这是我目前所拥有的:

src/
  __init__.py     # empty file (is it useful?)
  db/
    __init__.py   # empty file
    constants.py
  ui/
    __init__.py   # empty file
    index.py
  engine/
    ...some stuff...

这里是 index.py:

from .. import db
print(db.constants.stuff)

但是,运行 cd ui && python3 index.pypython3 -m index.py 失败并显示 SystemError: Parent module '' not loaded, cannot perform relative import

当我调整这个项目时,我有时会遇到其他错误,例如ValueError: Attempted relative import in non-package

根据我在https://docs.python.org/3/tutorial/modules.html 上读到的内容,这应该可行,不是吗?

我做错了什么?我应该怎么做(做这么简单的事情)使用来自其他两个包的公共包?

【问题讨论】:

  • 你能用tree之类的东西分享整个项目结构吗?因为当前信息仅显示每个包一个实际文件。也许你在混淆包和模块?
  • 这是实际的当前结构(engine 当前为空,但最终需要来自db 的内容)。所以是的,我目前每个包都有一个模块。但是包裹很快就会增长

标签: python python-3.x


【解决方案1】:

__init__.py 很有用,即使它是空的。它告诉python一个文件夹是一个python包。

我认为你需要的是修改系统路径。例如,假设您要将 constants.py 导入 index.py,index.py 将如下所示:

import sys
sys.path.append("..")
from db import constants

【讨论】:

  • 这行得通,非常感谢!但是,这种解决方法有多脏?我以为我读到这非常肮脏,所以我不想尝试这个(但见鬼,这很有效,这就是我在摆弄这些导入数小时后想要的全部)
  • 另外,我知道空的__init__.py 很好,但我想知道顶级的有多大用处。没有它也可以工作,但也许定义一个顶级包是一个好习惯?
  • 它所做的只是将当前脚本所在文件夹上方的文件夹附加到您的路径中,以便您可以导入同级模块。我不确定它是否算脏,这取决于解释。也就是说,更改项目结构以避免同级导入可能是个好主意。你能有一个包含所有类和函数的源目录,然后让 index.py 上一层来导入所有内容并运行一些主函数吗?
  • 就顶级 __init__.py 而言,如果您需要将此结构作为包导入到其他东西中,您将需要它。顶层是 python 包,还是包含其他包的项目?
  • 这只是一个项目。我很确定我永远不会将它用作一个包。所以我想我可以安全地删除这个文件。谢谢!
猜你喜欢
  • 2018-04-05
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 2020-02-24
  • 1970-01-01
  • 2016-01-15
  • 2017-10-05
  • 1970-01-01
相关资源
最近更新 更多