Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在相对导入中超越顶层包错误

在相对导入中超越顶层包错误
EN

Stack Overflow用户
提问于 2015-06-05 06:46:31
回答 14查看 551.2K关注 0票数 533

这里似乎已经有很多关于python 3中的相对导入的问题,但是在经历了许多问题之后,我仍然没有找到我的问题的答案。这就是问题所在。

我下面有一个包裹

代码语言:javascript
运行
AI代码解释
复制
package/
   __init__.py
   A/
      __init__.py
      foo.py
   test_A/
      __init__.py
      test.py

我在test.py中有一行:

代码语言:javascript
运行
AI代码解释
复制
from ..A import foo

现在,我在package文件夹中,然后运行

代码语言:javascript
运行
AI代码解释
复制
python -m test_A.test

我收到消息

代码语言:javascript
运行
AI代码解释
复制
"ValueError: attempted relative import beyond top-level package"

但是,如果我在package的父文件夹中,例如,我运行:

代码语言:javascript
运行
AI代码解释
复制
cd ..
python -m package.test_A.test

百事大吉。

现在我的问题是:当我在package的文件夹中,我以test_A.test的形式运行test_A子包中的模块,根据我的理解,..A只上升了一个级别,这仍然在package文件夹中,为什么它给出消息说beyond top-level package。导致此错误消息的确切原因是什么?

EN

回答 14

Stack Overflow用户

发布于 2017-10-31 00:19:37

编辑:在其他问题中,这个问题有更好/更连贯的答案:

为什么不能工作?这是因为python没有记录包从哪里加载的。因此,当您执行python -m test_A.test时,它基本上只是丢弃了test_A.test实际上存储在package中的知识(也就是说,package不是一个包)。尝试from ..A import foo正在尝试访问信息,它不再有任何信息(即加载位置的同级目录)。它在概念上类似于允许from ..os import pathmath文件中使用。这将是不好的,因为您希望包是不同的。如果他们需要使用来自另一个包的东西,那么他们应该用from os import path全局地引用它们,然后让python计算出$PATH$PYTHONPATH在哪里。

当您使用python -m package.test_A.test时,那么使用from ..A import foo可以很好地解决问题,因为它跟踪了package中的内容,并且您只是访问一个加载位置的子目录。

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

票数 261
EN

Stack Overflow用户

发布于 2017-08-24 21:25:42

代码语言:javascript
运行
AI代码解释
复制
import sys
sys.path.append("..") # Adds higher directory to python modules path.

尝尝这个。为我工作过。

票数 247
EN

Stack Overflow用户

发布于 2015-06-05 10:53:02

假设:

如果您位于package目录中,则Atest_A是单独的包。

结论:

..A导入仅允许在包中进行。

进一步说明:

如果要强制使包可以放置在sys.path上的任何路径上,则使相对导入仅在包中可用是非常有用的。

编辑:

难道只有我一个人认为这太疯狂了吗?为什么当前的工作目录不被认为是一个包?- 多猎手

当前工作目录通常位于sys.path中。所以,所有的文件都是重要的。这是自Python 2以来的行为,当包还不存在时。使正在运行的目录成为一个包,将允许以“导入.A”和“导入A”的形式导入模块,这将是两个不同的模块。也许这是一个不一致的考虑。

票数 56
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30669474

复制
相关文章
如何更改SELinux模式
Security Enhanced Linux是一个Linux安全模块,用于强制或基于角色的访问控制。SELinux默认与CentOS和Fedora打包在一起,可以以三种模式之一运行:禁用、允许或强制执行。
温浪
2018/08/20
4.3K0
Audition如何更改音轨独奏模式 Audition更改音轨独奏模式方法【干货】+各版本安装
各版本安装获取:http://jiaocheng8.top/au.html?0ijggjk Audition是一款特别专业的电脑端音频处理软件,软件时Adobe旗下发布的,软件的兼容性非常高,能够支持
木子学Lee
2023/02/09
7980
Audition如何更改音轨独奏模式 Audition更改音轨独奏模式方法【干货】+各版本安装
更改WordPress Gutenberg编辑器的宽度
要更改WordPress Gutenberg编辑器的宽度,您需要为其加载自定义CSS规则。以下是如何快速更改宽度的概述,包括加载样式表和添加将增加Gutenberg编辑器内容区域宽度的特定规则。
许都博客
2021/06/16
8560
13 - 如何让两个列表首尾相接
1. 连接两个列表的方式有哪些? # 1. '+' a = [1, 3, 5, 6, 7] b = [2, 3, 3, 6, 8] print(a + b) # 2. extend a.extend(b) print(a) [1, 3, 5, 6, 7, 2, 3, 3, 6, 8] [1, 3, 5, 6, 7, 2, 3, 3, 6, 8] # 元组:'+' # 元组本身是只读的,没有extend方法 c = (1, 2, 3) d = (2, 3, 3, 4) print(c + d) (1,
ruochen
2021/05/22
6240
13 - 如何让两个列表首尾相接
PHPCMS更改后台编辑器样式
PHPCMS默认的后台样式用着不习惯,根前台的视觉差太大?没关系,改一下就是了。 后台编辑器样式文件 staticsjsckeditorcontents.css 把前台样式表中控制文字的那一部分拷贝进去稍微修改下即可,当然你可以自定义编辑器背景什么的,看个人喜好了。 我自己比较喜欢的样式现在分享给大家
李维亮
2021/07/09
1.4K0
CSS样式更改——列表、表格和轮廓
上篇文章主要介绍了CSS样式更改篇中的字体设置Font&边框Border设置,这篇文章分享列表、表格和轮廓,一起来看看吧。
前端皮皮
2020/11/26
2.9K0
如何使用 Python 检查两个列表是否反向相等?
在 Python 中使用列表时,在某些情况下,您可能需要比较两个列表是否反向相等。这意味着一个列表中的元素与另一个列表中的元素相同,但顺序相反。在 Python 中,我们可以使用反转和比较列表、使用 zip() 函数、将列表转换为字符串等方法检查两个列表是否反向相等。在本文中,我们将了解这些方法,并借助各种示例检查两个列表是否反向相等。
很酷的站长
2023/08/11
2110
如何使用 Python 检查两个列表是否反向相等?
青铜和黄金选手分别怎么玩转python列表?
举个例子哈,将列表[1, 2, 3, 4, 5, 6, 7, 8, 9]中每个数字都乘以2,你能想到几种方法?
朱小五
2020/02/20
2880
青铜和黄金选手分别怎么玩转python列表?
仿 iOS 列表的编辑功能 - 删除篇
在 iOS 的设置里面,有一种编辑的效果,进入编辑状态后,列表左边推出圆形的删除按钮,点击后再出现右边确认删除按钮,相当于给用户二次确认。看下在 Android 上如何实现。
NanBox
2019/07/09
9680
更改开发编辑器背景图片
按快捷键Ctrl+Shift+A出现一个对话框 输入Set Background Image 双击Set Background Image 选择要添加的图片的路径 设置透明度 点击OK 就可以查看效果了
院长技术
2020/11/11
9930
如何更改伪元素的样式
在前端开发中我们会经常用到伪元素,有时候需要通过js来修改伪元素的样式,那么有哪几种方式来修改伪元素的样式呢?
挥刀北上
2021/01/27
9.4K0
如何更改伪元素的样式
vim的编辑模式,命令模式以及vim的实践
vim编辑模式:               从一般模式进入编辑模式,只需按i、I、a、A、o、O、r和R中的某一个键即可,当进入编辑模式时,在屏幕的尾行显示INSERT字样(若支持中文,则显示插入)。按Esc键,从编辑模式回到一般模式。              i(小写) 从目前光标所在处插入。              I (大写)从目前光标所在处第一个非空格开始插入。              a 从光标所在处的下一个字符开始插入。              A 从光标所在处行的最后一个字符卡是插入
叶瑾
2018/06/14
1.6K0
我有两个列表,现在需要找出两个列表中的不同元素,怎么做?
前几天在帮助粉丝解决问题的时候,遇到一个简单的小需求,这里拿出来跟大家一起分享,后面再次遇到的时候,可以从这里得到灵感。
Python进阶者
2023/03/02
3.3K0
我有两个列表,现在需要找出两个列表中的不同元素,怎么做?
[Linux] 更新源地址列表及更改方法 [Ubuntu 16.04 LTS]
在修改source.list前,最好先备份一份,以便日后恢复 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 修改更新源:sudo gedit /etc/apt/sources.list 最后执行更新命令:sudo apt-get update
轻舞飞扬SR
2021/02/24
1.3K0
vim 列编辑模式
vim 有三种编辑模式,命令模式、输入模式、视窗模式,我们常用的是前两种模式,但是视窗模式还是非常不错的,进入 vim 编辑器,模式是命令模式,可以通过 i、a 等进入输入模式,也可以通过 v、 c+v 进入视窗模式。
王清培
2019/07/01
3.2K0
vim 列编辑模式
如何更改 Ubuntu 的终端的颜色
但是,如果你想要一个独一无二的的终端体验或者符合你自身品位的一些东西,你也可以改变你的 Ubuntu 的终端的颜色。
用户1880875
2021/11/08
14.7K0
小知识:vi如何使用列编辑模式快速插入
经常需要用到列编辑这种操作,现在很多超文本的编辑器都可以轻松实现。 但有时需要在vi界面直接使用,但是vi的列编辑操作因不常使用总是忘记现查。 这次干脆记录下加深印象。 vi编辑某个文本时,比如修改一个oracle的参数文件,历史实验时取的实例名字是jyzhao, 如今实验我已经成功改成prod了,如下:
Alfred Zhao
2022/06/02
1.4K0
取两个列表的交集_js两个数组取差集
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/10
3.5K0
点击加载更多

相似问题

两个日期选择片段-如何分别编辑日期?

24

SwiftUI -列表编辑模式-如何更改删除按钮标题?

26

SwiftUI -如何在编辑模式下更改列表的背景

18

更改列表项处于编辑模式时的高度

10

函数返回两个列表,如何分别保存?

112
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文