当前位置: 首页 > 面试题库 >

Python-相对导入超出顶级包错误

慕朝明
2023-03-14
问题内容

似乎这里已经有很多关于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

一切都好。

现在我的问题是: 当我位于的文件夹中时packagetest_A.test根据我的理解,我在test_A子软件包中运行模块,原因是,该模块..A仅上升了一层(仍位于该package文件夹中),为什么它给出消息说beyond top-level package。究竟是什么原因导致此错误消息?


问题答案:

为什么不起作用?这是因为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找出与$PATHand 一起在哪里$PYTHONPATH

使用时python -m package.test_A.test,使用from ..A import foo解析就可以了,因为它可以跟踪其中的内容,package而你只是访问已加载位置的子目录。



 类似资料:
  • 这里似乎已经有很多关于Python3中的相对导入的问题,但是在研究了其中的许多问题之后,我仍然没有找到我的问题的答案。所以问题就在这里。 我有一个包裹如下所示 一切都很好. 现在我的问题是:当我在文件夹中,并且我将test_A子包中的模块作为运行时,根据我的理解,只上一级,仍然在文件夹中,为什么它给出的消息是。到底是什么原因导致了这个错误信息呢?

  • 我是一个新手。我刚刚开始写一个django项目。它被称为iRayProject,由两个应用程序iRay_user_authentication和iRay_working_with_notes组成:这里的项目结构 iRay_user_authentication - 这是一个用于注册的标准django应用程序 这是他的urls.py 在 views.py 注册用户使用重定向我想发送到项目的第二个应用

  • 我正在使用python 3.7,遇到了一个相对导入错误“试图相对导入超出顶级包”,文件夹结构如下:

  • 问题内容: 这是我的文件夹结构: 在我有: 在时: 现在,当我发出: 我得到: 由于“多份原件打印”是在sys.path中,并正确地解决它为什么抱怨相对进口上述顶层包? 这是顶层包 ? 顺便说一句,这是我向旧项目中添加测试的尝试-在Python测试包布局中曾提出过要求,但作为Python单元测试去哪儿的副本被关闭了。对我当前的测试包布局的评论深表感谢! 那么下面的答案不适用于我的情况: 该 模块

  • 如何在Python中从低级目录导入类? 我一直在阅读如何将添加到文件夹中(或者这只是在Python2中吗?)或者如何使用,但是这些都不起作用。 通过下面的代码,我得到了:valueerror:尝试相对导入超出顶级包 文件2.py 谢谢你。

  • 问题内容: 我的项目存在以下问题,请帮帮我!这是我的包裹的结构: 这是foo1.py的实现: 当我运行foo1时,出现错误: ValueError:尝试了相对于顶级包的相对导入 。 我可以通过以下调整来解决它: 但是我想知道是否有一种方法可以不导入sys并在其中附加父目录。 我听说,例如,如果我有.py文件’/pkg/start.py’,它调用了我的foo1模块,那么两个点就可以了。但是,有什么方