【问题标题】:IPython reloading different module?IPython重新加载不同的模块?
【发布时间】:2018-12-17 09:53:33
【问题描述】:

我做了一个测试,用我自己的遮蔽 Python 的内置字符串模块 名为“字符串”的模块,用于测试模块搜索路径行为。我的习惯 字符串脚本只有 print('string' * 2) 的内容。它是 位于当前目录,如下代码所示。

Python 3.6.4 |Anaconda custom (64-bit)| (default, Jan 16 2018, 10:22:32) [MSC v.1900 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: %pwd
Out[1]: 'C:\\Users\\stephen'

In [2]: import string

In [3]: string
Out[3]: <module 'string' from 'C:\\ProgramData\\Anaconda3\\lib\\string.py'>

In [4]: import imp

In [5]: imp.reload(string)
stringstring
Out[5]: <module 'string' from 'C:\\Users\\stephen\\string.py'>

关于 IPython 中 reload 的三个问题:

  1. 为什么reload 认为它实际导入的模块(本地string.py)已经被导入了?是否只是文件的相同性 姓名?
  2. 为什么重新加载导入的模块与已导入的模块不同?它是否跳过了 sys.modules 字典的检查,这是 在原始导入期间首先检查?
  3. 为什么 reload/IPython/Python 不知道它在这里拉了一个快速的模块,将一个模块切换到另一个模块?

编辑:在来回尝试处理 Stack Overflow 抱怨我的代码块时,我无意中丢失了一些我想说的话。以下是我能记住的: IPython 在启动时将内置字符串模块添加到 sys.modules 字典(在 sys.path 之前搜索 sys.modules),这是常规 Python 交互式提示符所不具备的。所以我从交互式提示与 IPython 中得到了不同的行为。通过交互式提示,我总是得到本地的 string.py,因为 sys.path 从当前目录开始进行模块搜索。所以,我对常规交互(Anaconda)和 IPython 之间的区别了解了这么多。我列出的问题让我感到困惑。

【问题讨论】:

  • 我会避免使用已经存在的模块名称。这很容易引起问题。
  • @JackMoody 是的,当然。通常,我不会为自己的模块使用这样的名称。这只是一个旨在更好地探索和理解这种冲突的练习。现在我试图了解我没想到的结果。

标签: python python-3.x import ipython reload


【解决方案1】:

reload应该重复定位它正在重新加载的模块的源代码的过程,如果它找到与原始导入找到的文件不同的文件,应该 /em> 使用新文件。毕竟,它需要处理模块被移动的情况,或者普通模块被更改为包或扩展模块的情况。

reloadnot 应该查看 sys.modules 并在发现某些东西时停止。如果这样做,它将不会执行重新加载!

reload 在初始 IPython 内部导入没有找到本地 string.py 文件的原因是因为自第一次导入以来导入路径已更改。您以一种不会导致 Python 本身将工作目录放在模块搜索路径上的方式运行 IPython,并且 IPython 从该配置下的标准库中导入了 string 模块。之后,IPython 将工作目录放在模块搜索路径本身,模仿常规的交互式 Python,所以reload 找到了本地的string.py

【讨论】:

  • 谢谢。我将您的回复标记为答案。但是,我会说,如果我在 IPython 启动后立即检查 sys.path,它确实在此列表的开头有空字符串,表明首先搜索工作目录。
  • @StephenFrost:如果“在 IPython 启动后立即”是指在 In[1] 提示符处,那是在 IPython 完成所有启动工作并编辑 sys.path 之后。
【解决方案2】:

Tested on my Kernel

看起来您使用的本地模块名称隐藏了应用程序所依赖的标准库或第三方包或模块的名称。 Python 导入通常从可能在 Users\stephen 下设置的 sys.path 设置检查。因此,当我们重新加载它时,它会选择第一次出现。希望对您有所帮助。

供参考:https://python-notes.curiousefficiency.org/en/latest/python_concepts/import_traps.html

【讨论】:

  • 谢谢。很好的参考链接。是的,我故意隐瞒,以探索导入行为(以确保我完全了解导入在内部是如何工作的——我不知道)。在我在问题中描述的场景中,我将在 sys.path 中添加 Users\stephen not
猜你喜欢
  • 2016-05-20
  • 2011-07-18
  • 1970-01-01
  • 2010-12-26
  • 1970-01-01
  • 2017-06-19
  • 2016-05-04
  • 2020-01-20
  • 2012-07-26
相关资源
最近更新 更多