我有一个脚本,可以将一些参数动态地写入配置文件,并且需要基于更新后的参数从链接的模块中调用某些函数。但是,当我在配置文件上调用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()语句,但是它们似乎无济于事。

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

最佳答案

该问题可能与创建日期相同的文件有关。看到这样的问题: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

关于python - reload()似乎没有重新加载模块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22952026/

10-12 18:54