作为this question的后续行动,我有一个新问题:
os.remove(module_name)
和del sys.modules["module_name"]
内部发生了什么?
答案 0 :(得分:4)
简短的回答是os.remove(module_name)
将从文件系统中删除文件。 del sys.modules["module_name"]
将从当前Python解释器正在维护的先前加载的模块的缓存中删除一个模块。
在Python中,当您导入模块时,解释器会检查是否存在与您尝试导入的.pyc
文件同名的.py
文件。如果存在,并且.py
文件自导入.pyc
文件后未发生更改,则Python将加载.pyc
文件(速度明显加快)。
如果.pyc
文件不存在,或者自创建.py
文件后.pyc
文件已更改,则会加载.py
文件并添加新文件.pyc
文件已创建。 (值得注意的是,只需运行一个Python文件,比如test.py
将而不是会导致test.pyc
被创建。只有import
个模块会导致这种情况发生。)
sys.modules
完全是另一回事。为了加速两次导入相同模块的代码,Python维护了在当前解释器会话期间导入的模块列表。如果要导入的模块位于sys.modules
中,则将读取缓存版本(磁盘上将不会检查.py
和.pyc
文件。 Python提供了一个内置函数reload()
,它允许您绕过模块缓存并强制从磁盘重新加载。
要获得有关Python模块系统的更多信息,请参阅modules上的文档。
答案 1 :(得分:2)
我开了很多这样的应用
import os
os.system('attrib +H *.pyc /S')
在Windows上,这会在应用程序启动时隐藏任何可见的编译文件 - 它们会给我点数。
答案 2 :(得分:1)
我为这份工作准备了一个班轮:
find . -name *.pyc |xargs rm
注意:您需要Linux(或类Unix操作系统)