【问题标题】:python import from different directory-'attempted relative import beyond top-level package'python 从不同目录导入-'尝试相对导入超出顶级包'
【发布时间】:2017-03-22 10:53:49
【问题描述】:
proj1
  |__ py1.py
  |__ py2.py
pkg
  |__ __init__.py
  |__ comm_f1.py
  |__mod1
  |  |__ __init__.py
  |  |__ f1.py
  |  |__ f2.py
  |__mod2
  |  |__ __init__.py
  |  |__ f3.py
  |  |__ f4.py

我知道有一些类似的问题,但我的问题似乎有点不同。 我有上面的项目和包目录。 'pkg' 目录包含一些我将用于我的项目'proj1' 或'proj2' 等的基本函数和类,因此我不想将'pkg' 保留在'proj1' 下。我用VS2015调试了'proj1',告诉它引用'pkg'目录,它工作得很好。但是现在我创建了 comm_f1.py,它有一些我相信可以被不同的子模块使用的通用函数/类,例如“mod1”和“mod2”等。例如,在 f3.py 中我想从 comm_f1 导入我的类通过使用:

from ..comm_f1 import myclass

它给了我一条错误消息“尝试相对导入超出顶级包” 我怎样才能优雅地解决这个问题?而且我不想涉及“pkg”的名称(或带有“pkg”的绝对目录路径名),因为我可能会更改“pkg”的名称,我想因为 comm_f1.py 仅在 f3.py 的父级目录,它不需要触摸它的祖父母'pkg'

【问题讨论】:

    标签: python


    【解决方案1】:

    你可以尝试扩展你的路径,然后像这样导入

    import sys
    sys.path.append("../")
    from comm_f1 import myclass
    

    【讨论】:

      【解决方案2】:
      proj1
        |__ py1.py
        |__ py2.py
      pkg
        |__ __init__.py
        |__common
        |  |__ __init__.py
        |  |__ comm_f1.py
        |__mod1
        |  |__ __init__.py
        |  |__ f1.py
        |  |__ f2.py
        |__mod2
        |  |__ __init__.py
        |  |__ f3.py
        |  |__ f4.py
      

      我没有找到确切的解决方案,但是如果我将这个 comm_f1.py 放入目录 common,请在通讯员 __init__.py 中声明 from comm_f1 import *,然后我可以在任何地方使用 from common import myclass 来使用所有内容.所以我添加了一个模块。我不知道这是否是一个好的解决方案或者它会有任何潜在的问题,但似乎有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-06
        • 2021-10-03
        • 2020-11-03
        • 2017-02-22
        • 1970-01-01
        • 2016-05-12
        相关资源
        最近更新 更多