为了账号安全,请及时绑定邮箱和手机立即绑定

超出相对导入中的顶级包错误

超出相对导入中的顶级包错误

慕无忌1623718 2019-08-15 17:21:02
超出相对导入中的顶级包错误看来这里已经有一些关于python 3中相对导入的问题了,但是在经历了很多这些问题后,我仍然找不到我的问题的答案。所以这是问题所在。我有一个如下所示的包裹package/    __init__.py    A/       __init__.py       foo.py    test_A/       __init__.py       test.py我在test.py中有一行:from ..A import foo现在,我在文件夹中package,我跑了python -m test_A.test我收到了消息"ValueError: attempted relative import beyond top-level package"但如果我在父文件夹中package,例如,我运行:cd ..python -m package.test_A.test一切都好。现在我的问题是: 当我在文件夹中时package,我在test_A子包中运行模块test_A.test,根据我的理解,..A只上升一个级别,它仍然在package文件夹中,为什么它给出了消息说beyond top-level package。导致此错误消息的原因是什么?
查看完整描述

3 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞



    为什么不起作用?这是因为python不记录从中加载包的位置。因此,当您这样做时python -m test_A.test,它基本上只丢弃test_A.test实际存储的知识package(即package不被视为包)。尝试from ..A import foo尝试访问它不再拥有的信息(即加载位置的兄弟目录)。它在概念上类似于允许from ..os import path在文件中math。这会很糟糕,因为你希望包是不同的。如果他们需要使用来自另一个包的东西,那么他们应该全局引用它们from os import path并让python在其中使用$PATH$PYTHONPATH

    当你使用时python -m package.test_A.test,然后使用from ..A import foo解析就好了,因为它跟踪了什么package,你只是访问加载位置的子目录。

    为什么python不认为当前的工作目录是一个包? 没有CLUE,但天哪它会有用。


    查看完整回答
    反对 回复 2019-08-15
    ?
    慕莱坞森

    TA贡献1810条经验 获得超4个赞

    import sys
    sys.path.append("..") # Adds higher directory to python modules path.


    查看完整回答
    反对 回复 2019-08-15
    • 3 回答
    • 0 关注
    • 550 浏览
    慕课专栏
    更多

    添加回答

    举报

    0/150
    提交
    取消
    意见反馈 帮助中心 APP下载
    官方微信