【问题标题】:Old code still being executed in ipython after files have been modified修改文件后,旧代码仍在 ipython 中执行
【发布时间】:2011-11-17 03:02:32
【问题描述】:

在file1.py中:

def foo():
    import file2
    print "I'm the old file1.py"
    file2.bar()

if __name__ == '__main__':
    foo()

在file2.py中

print "I'm the old file2.py"

def bar():
    print "I'm in the old file2.bar()"

在下面的交互会话的第 5 行,在对 file1.py 和 file2.py 进行修改后,将所有三个出现的单词 old 更改为 new,file2.py 中的 new 代码仍然没有用过的。

wim@wim-ubuntu:~/sandpit$ ipython
>>> run file1.py
I'm the old file2.py
I'm the old file1.py
I'm in the old file2.bar()
>>> !rm file2.pyc 
>>> # modify file1, file2
>>> run file1.py
I'm the new file1.py
I'm in the old file2.bar()

file2.py 中的旧代码是从哪里获取的?

我一定是误解了一些东西,因为我认为(来自run 上的 ipython 帮助):

文件在最初仅由以下内容组成的命名空间中执行 __name__ == '__main__'sys.argv 构造如所示。它因此 将其环境视为作为独立程序运行

我已经删除了 .pyc 文件,并且可以从命令whos 中看到命名空间中不存在 file2 模块。但是为什么第二次运行file1时没有再次执行导入?

【问题讨论】:

  • IPython.lib.dreload(或 0.10.x 中的 IPython.deep_reload)中的“深度重载”可能会帮助您。
  • 如果有人有类似的情况:我虽然有类似的问题,但我使用常规 python 运行代码(不是在解释器模式下)。即使删除.pyc 文件也无济于事。事实证明,当我向上滚动(使用 Vi 插件)时,它只是 Tmux 向我显示旧输出。
  • 你基本上每次都运行一个新的ipython 会话吗?

标签: python import module namespaces ipython


【解决方案1】:

run 不会启动新的 Python 进程,而是在当前进程中执行您的代码——不是在当前命名空间中,而是在当前 Python 进程中,文档中的注释解释说。因此,sys.modules 仍然存在并且使用旧的缓存模块。 (你熟悉 Python 正常缓存导入模块的方式吗?)

要解决此问题,请每次在新的 Python 进程中运行。 reload 有一点问题,可能会导致我觉得不值得的头痛。

【讨论】:

  • 什么是“要解决这个问题,每次都在一个新的 Python 进程中运行。重新加载不仅有一点问题,而且会导致我觉得不值得的头痛。”意思是?这是否意味着我每次更新脚本时都需要启动一个新的ipython 会话?
  • @CharlieParker 当您运行执行import foo 的脚本并且您已编辑foo.py 时,会出现相关问题。在这种情况下,您将不会选择编辑。一般来说,每次只运行新的脚本可能更容易思考问题。
  • 我希望我的脚本每次都能以全新的方式运行,而不必关闭 ipython,你知道这是怎么做到的吗?
  • @CharlieParker 如果您希望他们共享 Python 环境,而不是在单独的进程中运行脚本,我认为这不是不可能的。要在单独的进程中运行它,请使用! 进行系统调用或使用子进程模块。
猜你喜欢
  • 2014-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-05
  • 2010-10-19
  • 1970-01-01
  • 2021-05-01
  • 2011-01-28
相关资源
最近更新 更多