2011-09-14 255 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,你知道一個人怎麼做嗎? –