这是我的代码,使用函数中的reload()构建重新加载python模块。我已经看了一些(不是全部))stackoverflow中的其他问题和答案,但为了让我的代码工作,我仍然需要做一个os.remove('m.pyc')。任何人都可以向我解释一下,或者告诉我如何更改我的代码以便在没有删除的情况下进行以下工作。
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')
答案 0 :(得分:6)
通过使用time.sleep(1)
替换remove语句以防止几乎同时创建两个文件,我获得了正确的结果。我想问题是这两个文件都有相同的时间戳,这会阻止Python检测到更改并真正重新加载模块。
答案 1 :(得分: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) - &gt;没有。将字符串str写入文件。
请注意,由于缓冲,之前可能需要flush()或close() 磁盘上的文件反映了写入的数据。
以下是否适用于您?
f = open('m.py','wt')
f.write(r'def f(str): print "Sooo Original : %s"%(str)')
f.close()
import m
m.f('Original')
f = open('m.py','wt')
f.write(r'def f(str): print "Not so original : %s"%(str)')
f.close()
m = reload(m)
m.f('Copy')