修改文件后,ipython中仍执行旧代码
在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中的旧代码的呢?
我一定是误解了什么,因为我以为(根据ipython对run
的帮助说明):
这个文件在一个命名空间中执行,最初只包含
__name__ == '__main__'
和sys.argv
,就像它作为一个独立程序运行一样。
我已经删除了.pyc文件,并且从命令whos
中可以看到命名空间中没有file2模块。但是,为什么在第二次运行file1时,导入没有再次执行呢?
2 个回答
-1
我刚遇到这个问题,解决方法很简单
这是一个文本显示的问题,有些代码无法显示,可能被隐藏了。你需要做的就是把所有内容复制到一个 .txt 文件里,这样你就能看到很多旧的内容,删除这些旧内容,然后再把代码复制回你的 file.py 文件里。
旧文件:old.py
print("Im the new one")
但是在一个新的文本文件里,你会看到:
新文件:newText.txt
print("I am the old one!!!!")
#This is the old codeeeeeeeeeeeeeeeeee
print("Old codesssssssssss")
我知道这个解释听起来有点奇怪,但这就是我看到的真相!
2
run
并不是启动一个新的 Python 进程,而是在当前的进程中执行你的代码。这里的“当前”指的是 Python 进程,而不是命名空间。文档中有说明这一点。因为这样,sys.modules
依然存在,所以会使用之前缓存的模块。(你知道 Python 是怎么缓存导入的模块的吗?)
要解决这个问题,每次都在一个新的 Python 进程中运行代码。reload
使用起来有点麻烦,可能会引发一些麻烦事,我觉得这些麻烦不值得去碰。