为什么“导入模块”然后“从包导入模块”再次加载模块?

2024-04-06

我的 PYTHONPATH 中有一个包,看起来像这样:

package/
    __init__.py
    module.py
        print 'Loading module'

如果我从以下位置运行 Pythonpackage/目录(或在此目录中写入另一个模块)并输入

import module

它加载 module.py 并按预期打印出“正在加载模块”。但是,如果我然后输入

from package import module

它加载 module.py 并打印“加载模块”again,这是我没想到的。这样做的理由是什么?

注意:我想我从技术上理解为什么Python这样做,因为 sys.modules 键import module只是"module", 但对于from package import module it's "package.module"。所以我想我想知道的是为什么这里的键不同——为什么不将文件的路径名用作键,以便 Python 执行这里所期望的操作?


实际上,通过运行来自package目录,你错误配置了 Python。你不应该把那个目录放在sys.path,因为它在一个包内。

Python 不使用文件名作为键,因为它不是导入文件,而是导入模块。允许人们做'import c:\jim\my files\projects\code\stuff'会鼓励各种肮脏的行为。

考虑一下这种情况:如果你在~/foo/package/ and ~/bar正在PYTHONPATH- 但 ~/bar 只是一个符号链接~/foo?您是否希望 Python 能够解析符号链接,然后为您删除重复的符号链接?如果将相对目录放在 PYTHONPATH 上,然后更改目录会怎样?如果“foo.py”是“bar.py”的符号链接怎么办?您是否期望这两者也能被删除重复数据?如果它们不是符号链接,而只是精确的副本怎么办?添加复杂的规则来试图在模棱两可的情况下做一些方便的事情意味着它会做一些对其他人来说非常不方便的事情。 (Python 禅宗 12:面对歧义,拒绝猜测的诱惑。)

Python 在这里做了一些简单的事情,您有责任确保环境设置正确。现在,您可能会说将当前目录放在PYTHONPATH默认情况下 - 我什至可能同意你的观点 - 但鉴于它存在,它应该遵循与其他路径条目相同的一致规则集。如果打算从任意目录运行,您的应用程序始终可以从中删除当前目录sys.path从开始sys.path.remove('').

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

为什么“导入模块”然后“从包导入模块”再次加载模块? 的相关文章

  • from __future__ importabsolute_import 实际上做了什么?

    I have answered https stackoverflow com a 22679558 2588818一个关于Python中绝对导入的问题 我认为我通过阅读理解了这个问题Python 2 5 变更日志 https docs p
  • Python Numpy TypeError:输入类型不支持 ufunc 'isfinite'

    这是我的代码 def topK dataMat sensitivity meanVals np mean dataMat axis 0 meanRemoved dataMat meanVals covMat np cov meanRemov
  • Python:我可以修改元组吗?

    我有一个 2 D 元组 实际上我以为 它是一个列表 但错误说它是一个元组 但无论如何 该元组的形式为 浮点数 val prod id 现在我有一个字典 其中包含 key gt prod id 和 value prod name 现在 我想将
  • 在 Windows 上使用 Python 打开设备句柄

    我正在尝试使用 Giveio sys 驱动程序 该驱动程序需要先打开一个 文件 然后才能访问受保护的内存 我正在查看 WinAVR AVRdude 中的 C 示例 它使用以下语法 define DRIVERNAME giveio HANDL
  • 不要在异常堆栈中显示 Python raise-line

    当我在 Python 库中引发自己的异常时 异常堆栈将引发行本身显示为堆栈的最后一项 这显然不是一个错误 在概念上是正确的 但是当您在外部使用代码 例如作为模块 时 它会将重点放在对调试无用的东西上 有没有办法避免这种情况并强制 Pytho
  • 将 KB/MB/GB 等字符串解析为数值

    为了不发明自行车 我想知道是否有任何库能够将大小字符串 MB KB TB MiB KiB 等 的各种表示形式解析为基于数字字节的值 ActiveState Receipes 有一个示例here http code activestate c
  • 多级QTreeView

    我很难理解如何使用 QTreeView 和 QStandardItemModel 设置多级 QTree 这是我所拥有的 from PySide QtGui import import sys class MainFrame QWidget
  • scipy 的 curve_fit 函数的尺寸问题

    我对 python 中的曲线拟合以及一般的 python 都很陌生 目前 我正在尝试使用 scipy 中的 curve fit 模块来拟合 4 个光谱峰 简而言之 我的文本文件中有两列数据 所以我的第一步是将数据导入到两个数组中 一个包含
  • 使用 pymongo 查询空字段

    我想使用 python 查询 mongo 中的空字段 但是它很难处理单词 null 或 false 它要么给我错误 它们在 python 中未定义 要么在 mongo 中搜索字符串 null 和 false 这两种情况我都不希望发生 col
  • Python 字符串参数解析

    我正在 python 中使用 cmd 类 它将所有参数作为一个大字符串传递给我 将此 arg 字符串标记为 args 数组的最佳方法是什么 Example args arg arg1 arg2 with quotes arg4 arg5 1
  • Python Peeweeexecute_sql() 示例

    我使用 Peewee 模块作为我的项目的 ORM 我看了整个文档 没有明确的 有关如何处理 db execute sql 结果的示例 我跟踪代码 只能发现db execute sql 返回游标 有谁知道如何处理光标 例如迭代它并获取 返回复
  • numpy.polyfit 没有关键字“cov”

    我试图使用 polyfit 来找到一组数据的最佳拟合直线 但我还需要知道参数的不确定性 所以我也想要协方差矩阵 在线文档建议我写 polyfit x y 2 cov True 但这给出了错误 类型错误 polyfit 得到了意外的关键字参数
  • 来自字典列表列表的 Pandas DataFrame

    我有一个数据结构 它是字典列表的列表 Height 86 Left 1385 Top 215 Width 86 Height 87 Left 865 Top 266 Width 87 Height 103 Left 271 Top 506
  • Kivy:滚动缩放

    有没有办法在桌面 kivy 应用程序上放大图像 例如使用鼠标滚轮缩放 这里似乎讨论过 https github com kivy kivy issues 3563 https github com kivy kivy issues 3563
  • 如何使用Django模板作为组件?

    我有 5 个模板 index html detail html tag html login html register html and a 基本 html 所有 5 个模板都会扩展基本 html 索引 html 详细信息 html 标签
  • 对二进制数的字符串表示进行按位运算 python 2.7

    我想对二进制数的两个字符串表示执行按位或 但我不知道如何将字符串转换为原始二进制 a 010110 b 100000 a b 应该产生 110110 然后我想计算 on 位的数量 这应该返回 4 您可以使用内置的将字符串转换为二进制int
  • 将数值和分类数据混合到具有密集层的 keras 序列模型中

    我在 Pandas 数据框中有一个训练集 我将此数据框传递到model fit with df values 以下是有关 df 的一些信息 df values shape 981 5 df values 0 array 163 0 6 83
  • python字符串包含双引号字符

    我的输入字符串由字符组成 包括双引号和单引号 和 B SS JU PQ AD DDSFD ABD E J 但是 当我从文本文件打开上述输入并打印它时 第三行中的双引号 被打印为 xe2 x80 x9d 我的目标是进行简单的字符计数 B 2
  • Snakemake根据字典输入和输出

    我正在尝试重命名 Snakemake 管道中的一些文件 假设我有三个文件 FileA txt FileB txt FileC txt 我希望根据字典重新命名它们dict A 0 B 1 C 2 to get RenamedFile0 txt
  • launchd执行python脚本,但导入失败

    我使用 appscript 编写了一个 python 脚本来跟踪我当前活动的窗口 我通过 launchd 运行它 但是当我这样做时 它无法导入 appscript 我已经在 launchd 的 plist 中设置了 PYTHONPATH 但

随机推荐

  • Rails/Arel - 组合 AREL 谓词时的优先级

    模型有两个有趣的属性 forename and town 我想搜索理查德 伦敦 和布莱恩 马德里 从长远来看 p Person scoped pred1 p table forename eq Richard and p table tow
  • 如何在 R CMD 构建中使用 Makefile

    我正在开发一个 R 包 它基于一个仅使用 Makefile 的项目 其中大部分很容易翻译成R CMD build工作流程 然而 我需要创建的 pdf 有点复杂 除非我修补 否则我无法正确地创建它们 到目前为止 我想出了如何使用 Makefi
  • 如何让 valgrind 忽略某些行?

    例如 26460 2 bytes in 1 blocks are still reachable in loss record 2 of 105 26460 at 0x4C28BE3 malloc vg replace malloc c 2
  • 禁用输出缓冲

    Python 解释器中默认启用输出缓冲吗sys stdout 如果答案是肯定的 有哪些方法可以禁用它 到目前为止的建议 Use the u命令行开关 Wrap sys stdout在每次写入后刷新的对象中 Set PYTHONUNBUFFE
  • 如何在 WinForms 中使用依赖注入

    如何在 Winforms C 中定义依赖注入 接口IC类别 public interface ICategory void Save 类类别存储库 public class CategoryRepository ICategory priv
  • 如何创建一对一关系 SQL Server 图表

    有谁知道如何从 SQL Server 数据库图表创建一对一关系 你需要放一个unique key constraint on top of the foreign key 因此它仅限于一对一的关系
  • R 中的错​​误:要替换的项目数不是替换长度的倍数

    此代码向我显示此错误 要替换的项目数不是替换长度的倍数 我不知道问题出在哪里 所以这是代码 k lt c 0 0 0 0 x lt 30 t lt c 10 20 30 35 x1 lt x t for i in 1 4 k i lt 0
  • Spring 4.3.7 抛出 java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/util/DefaultIndenter

    当我从 spring 4 3 4 迁移到 4 3 7 时 添加 Jackson core 依赖项后遇到 NoclassDefined 错误 引起 org springframework beans BeanInstantiationExce
  • GWT 应用程序的内存使用情况

    我目前正在开发 GWT 应用程序 作为未来项目的技术证明 我喜欢用 Java 而不是 JavaScript 构建 AJAX 代码的方式 但当我重复调用 RPC 服务时 我似乎遇到了内存问题 浏览器内存使用量不断增长 当我搜索 Google
  • iphone、ipad 重复 UIView - 克隆视图

    如何复制 UIView 要求是一个视图内应该有两个视图 例如视图 A 和视图 B 更改一个视图也应该更改另一个视图 例如 考虑在视图 A 中添加一个 mpmediaplayer 意味着视图 B 应该显示与视图 A 中相同的视频 如果我在视图
  • 我如何在R中读取MTL文件

    我对 R 编程非常陌生 请有人告诉我如何读取用陆地卫星数据存档的 MTL 文件 对于随 Landsat 场景提供的标准 MTL 文件 该文件来自地球探索号 http earthexplorer usgs gov or Glovis http
  • 如何再次启动外部 JavaFX 程序?即使 JavaFX 程序以 Platform.Exit 结束,Launch 也会阻止这种情况发生

    从我的 MainProject Java 8 开始 我启动了一个 JavaFX 8 类 public void startFX if isRestartPrintModul true fxMain init else setRestartP
  • Android:发送数据短信时出现问题

    我已经编写了发送加密消息的代码 但加密数据 SMS 未发送 因为 onreceive 方法未调用 我认为接收器部分有问题 现在 我是 android 新手 任何人都可以帮助我以下代码有什么问题 我正在使用 RSA 算法 提前致谢 发送 pu
  • 使用 Javascript 循环将 Leaflet GeoJSON 层从 GeoServer 添加到数组

    我正在尝试使用循环将 GeoJSON 图层添加到数组中 然后将它们显示在我的地图上 我的目标是拥有一个像这样的变量 场景 json 1 第 1 层 场景 json 2 第 2 层 等等 myURL http localhost 8080 g
  • 按位非运算符解释

    为什么按位非运算符 在大多数语言中 会像这样转换以下值 2 gt 1 1 gt 0 0 gt 1 1 gt 2 不应该 2转换成2 1转换成 1 etc See 二进制补码 http en wikipedia org wiki Two 27
  • 如何按名称查找 Eclipse 项目和文件夹?

    有没有办法在 Eclipse 工作区中按名称搜索文件夹 项目 结果最好在我可以执行批量操作 例如关闭 打开 分配工作集 的视图中返回 手动点击数百个项目的列表实在是太麻烦了 这个看似微不足道的任务让我感到悲伤 在我经历了这么多年的日食之后
  • 如何停止后台运行的 PHP 脚本

    我开始这个过程 time php
  • 取消 handler.postdelayed 进程

    我在用handler postDelayed 在我的应用程序的下一阶段发生之前创建一个等待期 在等待期间 我显示一个带有进度条的对话框 cancel button 我的问题是我找不到办法取消帖子延迟时间过去之前的任务 我这样做是为了发布延迟
  • VS Code 远程 SSH 连接不起作用

    我正在尝试在第二台电脑上使用远程开发扩展设置 vscode 虽然它适用于我的主要一台 但不适用于第二台 尝试重新安装 vscode 扩展并使用旧版本 但没有任何效果 尝试连接时 选择操作系统后会取消 所以我什至无法输入密码 我的设置方式与另
  • 为什么“导入模块”然后“从包导入模块”再次加载模块?

    我的 PYTHONPATH 中有一个包 看起来像这样 package init py module py print Loading module 如果我从以下位置运行 Pythonpackage 目录 或在此目录中写入另一个模块 并输入