重新加载()不出现重新加载模块(reload() does not appear to reload

2019-09-28 00:47发布

我有一些参数写入到动态配置文件的脚本,我需要从基于更新的参数链接模块调用一些功能。 然而,当我打电话重载()的配置文件,有时我看不出有什么变化。

下面的代码片段会解释的情况:

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()语句,但他们似乎并没有帮助。

任何人都可以帮我诊断的问题?

Answer 1:

该问题可能与具有相同创建日期的文件做。 见这太问题: Python的imp.reload()函数不工作?

我能得到这个代码通过插入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 


Answer 2:

而不是依靠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()


文章来源: reload() does not appear to reload the module
标签: python reload