【问题标题】:Python imports structurePython 导入结构
【发布时间】:2015-12-14 17:59:12
【问题描述】:

我想为我的项目使用这种结构:

requirements.txt
README.md
.gitignore
project/
    __init__.py
    project.py
    core/
        __init__.py
        base.py
    engines/
        __init__.py
        engine1.py
        engine2.py
    utils/
        __init__.py
        refine_data.py
        whatever.py

应用程序从project/project.py 运行。但是,在使用相对或绝对导入时,我经常会遇到导入错误。

两个引擎都需要从project.core.base导入,utils也需要从project.core.base导入,project.py(运行的主文件)需要能够从engines导入。

绝对导入不起作用:

# engines/engine1.py
from project.core.base import MyBaseClass

给出错误:

ImportError: No module named project.core.base

但如果我尝试相对导入

# engines/engine1.py
from ..core.base import MyBaseClass

我明白了:

ValueError: Attempted relative import beyond toplevel package

我在 Github 上看到过其他类似结构的项目,但这似乎会导致各种问题。我如何让它发挥作用?

【问题讨论】:

  • 兄弟包应该能够相互导入。所以引擎可以只导入核心。

标签: python structure packages


【解决方案1】:

看看你的sys.path。很可能顶部的project 目录位于 python 路径中,并且它会将您的子包(即utilsengines 等)视为单独的包,这就是为什么它给您一个错误的原因'在进行相对导入时尝试从包外部导入,而绝对导入不起作用,因为它找不到顶级项目目录,因为它不在任何 python 路径下。

上方目录是需要添加到python路径的顶层项目目录。

例如

/path/is/here/project/core/...

# Add this to the PYTHONPATH
/path/is/here  

【讨论】:

  • 我应该只在脚本本身内做一个sys.path.append() 吗?
  • 你当然可以做到。您的软件包是要分发和安装的吗?如果是这样,你应该考虑为你的包创建一个 setup.py 脚本并安装它,确保它在 pythonpath 中
  • 我只是想从命令行运行project/project.py。但是如果我分发它,我一定会创建一个setup.py(我必须谷歌怎么做,我不知道该怎么做)。
  • 如果您正在运行project.py 目录,请意识到您不能从那里进行相对导入。此外,目前,每当您运行 python 文件时,它都会自动将其所在的目录添加到 python 路径中。
  • @BobDylan 有关使用脚本运行项目及其放置位置的更好解释,请参阅此答案 - stackoverflow.com/a/22183108/5679120
【解决方案2】:

尝试使用这些导入:

engine1.py:

from core import base

refine_data.py:

from core import base

项目.py

from engines import engine1

如果您使用 pycharm 标记 project 目录作为源根目录,然后尝试运行 project.py。如果您不使用 pycharm,您可以通过转到 project 目录并运行命令来运行 project.py:

python project.py

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 2014-01-08
    相关资源
    最近更新 更多