reload()似乎没有重新加载模块

时间:2014-04-09 03:06:28

标签: python reload

我有一个脚本可以动态地将一些参数写入配置文件,我需要根据更新的参数从链接模块中调用一些函数。但是,当我在配置文件上调用reload()时,有时我看不到任何更改。

以下代码段将解释该方案:

import options
import os
import someothermodule

def reload_options():
    global options
    options = reload(options)

def main():
    print dir(options)

    # do some work to get new value of the parameter
    new_value = do_some_work()

    with open('./options.py', 'w') as fd_out:
        fd_out.write('NEW_PARAMETER = %d\n' % (new_value,))  # write

        fd_out.flush()
        os.fsync(fd_out.fileno())

    reload_options()
    print dir(options)

    someothermodule.call_some_func()

if __name__ == '__main__':
    main()

有时候(这不会一直发生),两个打印语句都会打印相同的数据,这意味着NEW_PARAMETER从未显示过。我怀疑这是因为文件没有刷新到磁盘,所以我添加了flush()fsync()语句,但它们似乎没有帮助。

有人可以帮我诊断问题吗?

2 个答案:

答案 0 :(得分:2)

问题可能与具有相同创建日期的文件有关。请参阅此问题:Python's imp.reload() function is not working?

我能够通过插入一个sleep语句来获得此代码:

   # replace NEW_PARAMETER in options.py with numbers in the range 0-9
   for ii in range(10):
        new_value = ii

        # Sleep here to let the system clock tick over
        time.sleep(1)

        with open('./options.py', 'w') as fd_out:
            fd_out.write('NEW_PARAMETER = %d\n' % (new_value,))  # write                                                 
            fd_out.flush()
            os.fsync(fd_out.fileno())

        reload_options()
        print ii,options.NEW_PARAMETER 

答案 1 :(得分:1)

为什么不直接添加/修改模块上的属性以供当前使用,还是将其输出到文件以供将来使用?

不是依赖于reload
import options
import os
import someothermodule

def main():
    # do some work to get new value of the parameter
    new_value = do_some_work()

    # assign value for now
    options.NEW_PARAMETER = new_value

    # store value for later
    with open('./options.py', 'w') as fd_out:
        fd_out.write('NEW_PARAMETER = {}'.format(new_value))

    print dir(options)

    someothermodule.call_some_func()