【问题标题】:Python sub-package referencesPython 子包参考
【发布时间】:2011-01-21 13:08:14
【问题描述】:

我对一个本应非常简单的问题束手无策。这是我为解决我的问题而编写的一个简单示例的格式。我在 __init__.py 中有一个带有 __all__ = ["p1","p2"] 的文件夹顶部。然后,我在两个子文件夹 p1 和 p2 中都有__init__.py__all__ 再次定义了两个简单模块 quick1 和 quick 2 的名称,其中 quick1 在 p1 中,quick2 在 p2 中。如果我从 top 之外的脚本导入 top.p1.quick1 则导入工作正常。但是,尝试从 quick2 导入 top.p1.quick1 会出现错误 File "quick1.py", line 1, in <module> import top.p2.quick2 ImportError: No module named top.p2.quick2 如何从另一个子包中导入模块?据我所知,这应该根据 python 文档工作。有没有人看到我犯了一个明显的、微不足道的错误?

编辑:看来我需要将带有顶部的目录添加到我的搜索路径中。我可以通过设置 PYTHONPATH 临时做到这一点。但是,有没有更好的方法可以从 distutils 脚本中执行此操作?

【问题讨论】:

    标签: python import packages


    【解决方案1】:

    您的问题是您的顶级包不在您的 sys.path 中。

    【讨论】:

    • 啊。这似乎是个问题。我可以暂时将目录添加到 PYTHONPATH,但是有没有办法从 distutils 永久添加目录?还有其他添加路径的首选方式吗?
    【解决方案2】:

    您所描述的一切都很好,并且不会重现错误——这是我能想到的最简单的版本:

    $ mkdir /tmp/path
    $ mkdir /tmp/path/top /tmp/path/top/p1 /tmp/path/top/p2
    $ touch /tmp/path/top/__init__.py /tmp/path/top/p1/__init__.py /tmp/path/top/p2/__init__.py
    $ touch /tmp/path/top/p1/quick1.py /tmp/path/top/p2/quick2.py$ echo 'import top.p1.quick1' > /tmp/path/top/p2/quick2.py
    $ PYTHONPATH=/tmp/path python /tmp/path/top/p2/quick2.py
    $ python -c 'import sys; sys.path.append("/tmp/path"); import top.p2.quick2'
    

    它运行得很好。 __all__ 是不相关的,除非您使用的是 from ... import *,但您不是(而且您不应该这样做)。只要top(这里是/tmp/path)的父目录在sys.path上,一切都会好起来的;如果该父目录不存在,则会出现错误。

    那么,为了重现您观察到的错误,您可以对这一系列操作进行最小的更改是什么?

    【讨论】:

    • 我认为他的最小更改是将最后一行更改为:echo 'import top.p2.quick2' &gt; /tmp/path/top/p1/quick1.py; python /tmp/path/top/p1/quick1.py
    • 这将是一个可能的错误,是的 - 一种打破“只要顶部的父目录(此处为 /tmp/path)在 sys.path 上”条件的简单方法(到引用我的回答——ddaa的回答也提到了)。不过,还有其他错误可能会破坏这种情况(将/tmp/path/top 代替/tmp/path 代替sys.path 是在野外经常观察到的一个错误,例如——父母与孩子的混淆)。
    猜你喜欢
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    相关资源
    最近更新 更多