【问题标题】:How to do relative imports in Python with this structure?如何使用这种结构在 Python 中进行相对导入?
【发布时间】:2013-01-18 20:29:51
【问题描述】:

想象一下我有这样的结构:

dir/
   __init__.py
   dir1/
       __init__.py
       x.py
   dir2/
       __init__.py
       y.py

现在我想将 x.py 导入到 y.py 中。
我在PEP 328 的y.py 中尝试了这个from ..dir1.x import *,但我收到了这个错误Attempted relative import in non-package
我搜索了几个小时,但我找不到这个问题的任何答案。
有很多像我这样的类似问题,但没有一个像 this 那样对我有帮助
请帮忙。
非常感谢。

【问题讨论】:

  • 从表面上看,这看起来与您链接到的另一个问题完全相同;您可能应该在这里解释为什么该解决方案不适合您。
  • 你是对的,但如果我知道问题出在哪里,我就不会再问了。我再次问这个问题是为了找到问题。

标签: python python-import relative-path


【解决方案1】:

y.py,添加这段导入代码

import sys
sys.path.insert(0, '..')

然后做

from dir1.x import *

【讨论】:

  • 非常感谢,但第一次导入是做什么的?我认为这是工作,但这样做并不干净。
  • @XLichking 首先导入以确保父目录在您的 python 的搜索路径下,以便它可以将 dir1 识别为要导入的有效模块。它看起来并不干净,仅仅是因为你要求的东西首先在 python 中不是一件自然的事情。
  • 非常感谢,但我怎样才能改变我的结构正常?
  • @XLichking 你可以重新组织你的模块,使子模块不相互依赖,或者你可以尝试在根目录中做所有事情,例如,在@987654325 下写一个main.py 文件@ 导入dir1dir2 并在那里做事。
【解决方案2】:

直接调用文件时,相对导入不起作用:

python y.py

因为他们有 __name__ == '__main__' 而不是他们的完整包名。

要使相对导入起作用,您必须使用 y 作为一个包:

python -m dir.dir2.y

【讨论】:

  • 非常感谢。但我是 python 新手。我怎么能运行最后一个命令?我用窗户。
  • 我在 python 文件夹中的 cmd 中使用它:python -m c:\Users\my_user_name\Desktop\dir\dir2\y 但我收到此错误:没有名为 c:\Users\my_user_name\ 的模块桌面\dir\dir2\y
猜你喜欢
  • 2021-10-19
  • 2013-09-28
  • 1970-01-01
  • 2023-03-20
  • 2010-12-07
  • 1970-01-01
  • 2019-11-24
相关资源
最近更新 更多