2011-09-14 153 views
4

在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代码仍未被使用。

[email protected]:~/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的旧代码?

我必须误解的东西,因为我认为(从IPython的帮助上run):

该文件命名空间中的最初只包括 __name__ == '__main__'sys.argv指示构建执行。因此,它 看到它的环境,如果它正在运行一个独立的程序

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

+0

“IPython.lib.dreload”中的“deep reload”(或0.10.x中的“IPython.deep_reload”)可能会帮助您解决这个问题。 –

+0

如果有人有类似的情况:我虽然我有类似的问题,除了我用普通的python(而不是解释器模式)运行代码。即使删除'.pyc'文件也没有帮助。事实证明,当我向上滚动时(使用Vi插件),只是Tmux向我展示了旧输出。 –

+0

你刚刚基本上每次运行一个新的'ipython'会话吗? –

回答

3

run没有启动一个新的Python进程,而是在当前的进程中执行代码 - 而不是在当前的命名空间中,但是在当前的Python进程中,文档的注释说明了这一点。因此,sys.modules仍然在使用旧的缓存模块。 (您是否熟悉Python正常缓存导入模块的方式?)

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

+0

什么是“为了解决这个问题,每次都要在一个新的Python进程中运行。重装不仅仅是有点问题,而且会导致令人头痛的问题,我觉得这不值得。”意思?这是否意味着我每次更新脚本时都需要启动一个新的'ipython'会话? –

+0

@CharlieParker当你运行一个'import foo'的脚本,并编辑了'foo.py'时,会出现相关的问题。在这种情况下,你不会选择编辑。一般来说,当你每次运行新鲜的脚本时,考虑事情可能会更容易。 –

+0

我希望我的脚本每次都能够运行得新鲜无需关闭ipython,你知道一个人怎么做吗? –