【问题标题】:Python: importing a sub-package module from both the sub-package and the main packagePython:从子包和主包中导入子包模块
【发布时间】:2017-02-25 03:03:58
【问题描述】:

这是我的第一个 stackoverflow 问题。我确实搜索了一个答案,但找不到一个明确的答案。这是情况。我有这样的结构:

myapp
    package/
         __init.py__
         main.py
         mod1.py
         mod2.py

现在,在这种情况下,我从 main.py 导入 mod1.py,它也需要通过 mod2.py 导入。一切正常,我的导入如下所示:

main.py:

from mod1 import Class1

mod2.py:

from mod1 import Class1

但是,我需要将 main.py 移动到主文件夹结构中,如下所示:

myapp
    main.py
    package/
         __init.py__
         mod1.py
         mod2.py

现在发生的事情是,我当然需要更改在 main.py 中导入 mod1 的方式:

from package.mod1 import Class1

然而,为了不出现“ImportError: No module named 'mod1'”,我在 mod2.py 中进行了相同类型的更改:

from package.mod1 import Class1

这是为什么呢? mod2 与 mod1 在同一个文件夹/pakcage 中,那么为什么 - 在修改 main.py 时 - 我希望在 mod2 中修改我的导入?

【问题讨论】:

  • 主要导入 mod2 吗?
  • @rassar:是的,确实如此。
  • 所以发生这种情况的原因是因为 main 和 mod2 都想导入 mod1 并且 main 在层次结构中更高。见stackoverflow.com/questions/15174730/…
  • 你试过from .mod1 import mod2吗?
  • @rassar:谢谢,我想我现在明白了。只是为了确认我的理解是否正确——首先运行的模块是顶级模块,随后发生的所有导入都与该模块的位置有关(在这种情况下为 main.py)——这是正确的吗?

标签: python import


【解决方案1】:

发生这种情况的原因是当您将 python 脚本作为 __main__ 脚本运行时,python 如何查找模块和包。

当你运行python main.py 时,python 会将main.py 的父目录添加到pythonpath,这意味着目录中的包和模块将是可导入的。当您移动 main.py 时,您更改了添加到 pythonpath 的目录。

通常,您不想依赖这种机制来导入模块,因为它不允许您移动脚本,并且您的包和模块在运行该 main 时可导入脚本。你应该做的是确保你的package 安装到已经在 pythonpath 中的目录中。有几种方法可以做到这一点,但最常见的是创建一个 setup.py 脚本,实际上是 install your python package 用于在您的计算机上安装 python。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 2013-12-28
    • 2023-01-09
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    相关资源
    最近更新 更多