删除*.pyc后重新运行.py脚本的奇怪行为
我有三个模块,分别是:
one.py
:
def abc():
print "Heeeeeeeeeeeiiiiiioooooooooo"
two.py
:
import one
def defg():
one.abc()
three.py
:
import os
from time import sleep
import two
two.defg()
sleep(20)
directory = os.listdir('.')
for filename in directory:
if filename[-3:] == 'pyc':
print '- ' + filename
os.remove(filename)
我有三个疑问。
当我第一次运行 three.py
时,会生成 one.pyc
和 two.pyc
文件。我能看到这些文件,因为我设置了20秒的延迟。在执行了 os.remove(filename)
这条语句后,这些文件就被删除了。到这里为止一切正常。
然后,我没有关闭IDLE和脚本,又运行了一次 three.py
。这次没有生成 .pyc
文件。为什么会这样呢?
如果我关闭IDLE和脚本,.pyc
文件会像之前一样被创建。
为什么编译后的代码不会一次又一次地被创建?
还有,如果我在
one.py
中做了修改,如果不关闭窗口运行的话,修改的内容不会显示。我也需要一个解决方案。第三个疑问是,如果编译后的代码第一次就被删除了,为什么第二次运行时没有
.pyc
还可以得到相同的结果?
3 个回答
1
编辑你的 ~/.bashrc 文件,并在里面添加这个 shell 函数
$ cd ; pyclean
pyclean () {
find . -type f -name "*.py[co]" -delete
find . -type d -name "__pycache__" -delete
}
1
我觉得IDLE在自己的Python程序里存储了字节码,所以每次运行文件的时候,它不需要重新生成这些字节码。
8
.pyc
文件没有再次被创建,是因为你的代码中有对已导入模块的引用。当你重新运行代码时,这个引用会被使用。
这就是为什么 .pyc
文件不会再次生成,也就是你所做的额外修改没有被执行的原因。
你可以选择删除所有引用,然后调用垃圾回收,或者使用内置的 reload()
函数来重新加载模块。例如:
reload(three)