2011-06-25 66 views
2

这里是我的代码重新加载使用重载一个Python模块()建立功能。我已经看了一些(不是所有:))其他的问题和答案在计算器,但把我的代码工作,我仍然需要做一个os.remove(“m.pyc”)。任何人都可以向我解释或告诉我如何改变我的代码,使下面的工作没有删除。另一个Python模块重装问题

import os 

open('m.py','wt').write(r'def f(str): print "Sooo Original : %s"%(str)') 
import m 
m.f('Original') 

os.remove('m.pyc') 

open('m.py','wt').write(r'def f(str): print "Not so original : %s"%(str)') 
m = reload(m) 
m.f('Copy') 

回答

6

通过与time.sleep(1)免去您删除语句来避免这两个文件被创建的几乎同时,我获得正确的结果。我想问题是这两个文件都有相同的时间戳,从而阻止Python检测到更改并真正重新加载模块。

+0

是的,你说的确实有效,但它对我来说很奇怪,为什么python在我们要求导入它时没有再真正导入模块。 –

+0

pyc是一个未连接到重装机制的缓存机制。如果Python没有检测到需要重建它的缓存,那么导入和重新加载仍然会使用相同的旧pyc似乎很正常。你需要的是一种使pyc缓存无效的方法(这是你在删除pyc文件时所做的)。 – JMD

+0

据我所知,它通过时间戳去,所以另一种策略是改变m.pyc的时间戳(一个过去的日期),而不是等待或干脆删除文件。 –

0

我得到我的机器上的一个不同的问题。

Traceback (most recent call last): 
    File "test.py", line 8, in <module> 
    m.f('Original') 
AttributeError: 'module' object has no attribute 'f' 

我注意到你没有关闭您的文件,因此它可以使文件的内容被在缓冲区中举行,正在等待被写入磁盘。所以当你重新加载模块时,python仍然会看到该文件的原始版本。

从文档file.write

写(...) 写(STR) - >无。将字符串str写入文件。

注意的是,由于缓冲,冲洗()或close() 之前,可能需要磁盘上的文件反映写入的数据。

为您做以下工作?