删除*.pyc后重新运行.py脚本的奇怪行为

1 投票
3 回答
2453 浏览
提问于 2025-04-15 11:08

我有三个模块,分别是:

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.pyctwo.pyc 文件。我能看到这些文件,因为我设置了20秒的延迟。在执行了 os.remove(filename) 这条语句后,这些文件就被删除了。到这里为止一切正常。

然后,我没有关闭IDLE和脚本,又运行了一次 three.py。这次没有生成 .pyc 文件。为什么会这样呢?

如果我关闭IDLE和脚本,.pyc 文件会像之前一样被创建。

  1. 为什么编译后的代码不会一次又一次地被创建?

  2. 还有,如果我在 one.py 中做了修改,如果不关闭窗口运行的话,修改的内容不会显示。我也需要一个解决方案。

  3. 第三个疑问是,如果编译后的代码第一次就被删除了,为什么第二次运行时没有 .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)

撰写回答