从其他包导入包

时间:2017-10-24 12:01:09

标签: python-3.x import python-import

我有一个非常简单的项目架构:

project/
  __init__.py
  dira/
    __init__.py
    a.py
  dirb/
    __init__.py
    b.py

所有__init__.py都是空的。 a.py只包含一个"你好"功能:

def hello(): return "hello world"

我希望b.py使用a.py中的hello函数。

到目前为止我尝试了什么:

根据this question的答案,我尝试了:

import ..dira.a as aa
aa.hello

但是当运行b.py时,..a.a

会出现语法错误

我还尝试手动将项目目录添加到sys.path然后运行:

import dira.a as aa
aa.hello

但是当我运行b.py时,我得到了:

  

ImportError:没有名为' a'

的模块

我该怎么办?为什么我找到的解决方案不起作用?

1 个答案:

答案 0 :(得分:0)

简短回答: import ..dira语法无效,只有from ..dira.a import hello有效 工作配置:b.py:

from ..dira.a import hello
print(hello())

另外,来自docs:

  

“请注意,相对导入基于当前的名称   模块。由于主模块的名称始终为“ main ”,   用作Python应用程序主模块的模块   必须始终使用绝对进口。“

因此,如果您进行相对导入,则无法直接调用b.py.显然,您无法从项目级别执行此操作。 (project文件夹中的Python解释器,调用import dirb.b

An error occurs:
    ValueError: attempted relative import beyond top-level package

但是调用import project.dirb.b会产生正确的输出:

hello world

编辑:Why import project.dirb.b can be called only outside of project module?

让我们从翻译方面看问题。

  1. 您致电import project.dirb.b。它运行dirb / init .py,'current module'是project.dirb
  2. Interpreter从..dira.a导入hello
  3. 查找命令
  4. 它将双点..dira.a视为“移动一个模块并转到dira并导入a.hello”。 '当前模块'是project.dirb,因此父模块是项目,因此它找到parent.dira
  5. 直接调用import dirb.b会发生什么?尝试在模块层次结构中升级并报告错误时失败。
  6. 因此,相对导入使project.dirb.b只能在项目之外导入。