Python 子模块在 python 3.7 中正确导入,但在 3.6 中则不然

2024-03-24

我的目录结构如下:

test/
  __init__.py
  m1/
    __init__.py
    f1.py
    f2.py

test/__init__.py是空的。

test/m1/__init__.py包含一行import test.m1.f1.

test/m1/f1.py包含一行import test.m1.f2 as f2.

在 python 3.7.6 中,我可以做import test.m1一切都按预期进行。但是,在 python 3.6.9 中,当我尝试这样做时,出现以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/scratch/test/m1/__init__.py", line 2, in <module>
    import test.m1.f1
  File "/home/scratch/test/m1/f1.py", line 1, in <module>
    import test.m1.f2 as f2
AttributeError: module 'test' has no attribute 'm1'

这看起来很奇怪,因为它不会出错import test.m1.f1,这是它遇到的第一件事。它在随后的错误import test.m1.f2 as f2声明,声称test has no m1子模块。


import test.m1.f2 as f2尝试访问m1的属性test模块对象,作为查找要绑定的对象过程的一部分f2. The m1属性不会被设置,直到test.m1子包完成初始化,直到__init__.py for test.m1执行完毕。

在 Python 3.7 及更高版本上 https://bugs.python.org/issue30024,如果属性查找失败,则导入回退到sys.modules['test.m1.f2']查找找到test.m1.f2。 3.6 中不存在这种回退,导致观察到的差异。

类似的后备 https://bugs.python.org/issue17636也存在于圆形from不过,在 Python 3.5 及更高版本上导入from . import f2 or from test.m1 import f2不需要后备。这from导入检索test.m1直接来自sys.modules,所以它只寻找f2属性,并且该属性存在。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 子模块在 python 3.7 中正确导入,但在 3.6 中则不然 的相关文章

随机推荐

  • 架构配置无效:“model”不是数组“characters”中的有效类型

    我正在尝试创建架构子文档 但收到上面列出的错误 有问题的模式看起来像这样架构导致问题 const mongoose require mongoose const Schema mongoose Schema const CharacterS
  • 从 xargs 运行时,如何避免 sed 出现“无输入文件”错误?

    我有这个 shell 脚本来更新我的配置文件中的 IP 地址 任何匹配的 old address pattern必须改为 new address grep rl old address pattern etc xargs sed i s o
  • 如何允许或阻止 Headless chrome 上的通知警报

    我正在运行我的量角器测试headlesschrome 我不确定无头chrome是否会弹出通知警报 如果弹出 如何允许和阻止它们 对于非无头 Chrome 我添加了此中给出的解决方法post https github com angular
  • ERP 的最佳默认事务隔离级别是多少(如果有)?

    简短背景 我们刚刚开始使用 Hibernate 将 ERP 系统迁移 重新实现到 Java 目标是使用该系统的并发用户数为 50 100 个 我们使用 MS SQL Server 作为数据库服务器 这足以满足此负载 现在 旧系统根本不使用任
  • 如何使用SQL Server数据库项目

    我正在运行安装了 SSDT SQL Server Data Tools 的 SQL Server 2012 和 VS 2010 我的开发数据库使用存储过程 函数 CLR 对象等 它有大约 500GB 的生产数据快照 我创建了 SQL Ser
  • 如何正确处理我的 WebGL 上下文以避免 16 WebGL 上下文错误? [复制]

    这个问题在这里已经有答案了 这是此问题的后续问题 该主体的实时 WebGL 上下文超过 16 个 丢失了最近最少使用的一个 https stackoverflow com q 33800600 2715716 在该问题中 我们发现当您刷新
  • 如何使用 NSJSONSerialization

    我有一个 JSON 字符串 来自 PHP 的json encode 看起来像这样 id 1 name Aaa id 2 name Bbb 我想将其解析为我的 iPhone 应用程序的某种数据结构 我想对我来说最好的事情就是拥有一个字典数组
  • 如何使用 HTML5 音频标签创建自动播放列表?

    如何使用 HTML5 的音频标签创建自动播放列表 我想要实现的是一个只有播放 暂停按钮大 30x25 px 的播放器 播放器在页面加载时自动播放 当歌曲结束时 它会自动播放下一首歌曲 尝试在播放列表中包含 3 4 首歌曲 查看这篇文章 使用
  • ng-select 中的对象及其属性

    我一直在试图弄清楚如何使用数组 if 对象作为 ng select 指令的键值 这是我想使用的数据 scope selectValues name Options 1 value 11 name Options 2 value 22 nam
  • 如何从 key.pk8 和certificate.pem 生成 Android 密钥库?

    所以今天我终于将我的 SDK 更新到 22 0 0 但这会在 AndroidManifest xml 中创建一个错误android debuggable false 这意味着我无法再从外部签名和压缩我自己的 APK 我一直使用自己的 key
  • scanf 格式说明符从一组字符中读取零个或多个字符

    我需要对读取字符串中可以包含的字符非常严格 我有一系列空格 后面跟着一个字符 后面跟着一系列空格 例子 c c 我需要找到一个格式说明符 它允许我忽略该字符 但前提是它是这个特定字符而不是任何其他字符 这个序列 e 应该被中止 I trie
  • Azure ARM 模板(取决于)

    寻求一些指导和解释dependsOn 我在模板中看到有两种在模板中提供依赖项的方法 一种方法是提供resourceId另一种方法是使用提供字符串值concat 我试图理解两者之间的区别 Example concat Microsoft Ne
  • 错误:指针和整数之间的比较

    我正在尝试编写一个可以处理重定向的简单 shell 但是 我得到 错误 指针和整数之间的比较 我明白为什么会出现错误 但我不确定如何修复它 args 声明为 static char args 512 这是我收到错误的代码 if args l
  • Visual Studio上的Nuget包推送403错误

    我创建了一个视觉工作室类库 我想将其作为一个包发送给 Nuget 我用了视觉工作室包管理器安慰 命令如下 nuget spac 你好nuget nuget 包 hellonuget nuspec nuget 推送 hellonuget 1
  • 如何在“表格列表”中仅显示一次表格标题,以便将表格拆分为多个页面

    我正在使用 R 包 xtable and knitr 和乳胶包 longtable and hyperref 准备一份文件 我的一张桌子很长并且分成多页 事实证明 表列表 显示了该表出现的每个页码 但所有超链接都将我带到了该表的开头 我的问
  • CSS Sprites 在 IE 中不起作用[8/7/6]

    我正在尝试 CSS 使用精灵来动画我的风险矩阵 它在 Firefox 和 Chrome 中工作得很好 但图像不会显示在 IE 中 代码如下 不想将整个内容粘贴到此处 但摘录显示了模式 dl dd a a dd dd a a dd dl
  • 隐藏文件夹 C# [重复]

    这个问题在这里已经有答案了 可能的重复 C 获取不包括隐藏文件的文件列表 https stackoverflow com questions 2418270 c get a list of files excluding those tha
  • android 背景重复-y

    我有一个图像 我想将其放置在右侧并在 y 轴上重复它 HTML 中类似于 背景 url img png 右重复 y 在android中可以做到这一点吗 当我将此位图设置为背景时 它不在右侧
  • 检查 FTP 服务器上的可用空间

    我正在运行一个构建脚本 其中三个可执行文件 每个 100mb 被上传到 FTP 服务器 由于 FTP 服务器空间问题 第一次上传可能会失败 因此我们的构建过程会失败 这意味着我必须从服务器释放一些空间并再次运行构建脚本 这是浪费时间 我想在
  • Python 子模块在 python 3.7 中正确导入,但在 3.6 中则不然

    我的目录结构如下 test init py m1 init py f1 py f2 py test init py是空的 test m1 init py包含一行import test m1 f1 test m1 f1 py包含一行impor