修改文件后,ipython中仍执行旧代码

6 投票
2 回答
7586 浏览
提问于 2025-04-17 02:17

在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 使用起来有点麻烦,可能会引发一些麻烦事,我觉得这些麻烦不值得去碰。

撰写回答