【问题标题】:.Conf file manipulation from multiple python scripts.Conf 来自多个 python 脚本的文件操作
【发布时间】:2013-12-04 13:20:54
【问题描述】:

我正在使用 ConfigParser 模块从两个 Python 脚本读取/写入 .conf 文件。一个脚本只读取数据,而另一个也可能写入 .conf 文件。考虑到这种情况可能以损坏的数据结束?或者 ConfigParser 正在阻止这种情况?

干杯

【问题讨论】:

    标签: python multiprocessing configparser


    【解决方案1】:

    ConfigParser 本身不知道如何打开和写入物理文件,因此无法防止竞争。您将一个类似文件的对象传递给write(),并由您来确保您正在更改的文件以原子方式更新。在 Linux 等 POSIX 系统上,这通常通过写入临时文件并在写入完成后将其重命名为最终名称来完成。

    原子重命名要求源文件和目标文件位于同一文件系统上,保证这一点的简单方法是确保文件位于同一目录中。

    import ConfigParser
    import os
    import tempfile
    
    FILENAME = '/some/path/test.config'
    
    config = ConfigParser.SafeConfigParser()
    config.read([FILENAME])
    config.add_section('foo')
    with tempfile.NamedTemporaryFile(dir=os.path.dirname(FILENAME),
                                     delete=False) as tempfile:
      config.write(tempfile)
    os.rename(tempfile.name, FILENAME)
    

    这假设除了一个或多个并发读取器之外,您只有一个配置文件的并发写入器。

    在 Windows 上进行原子替换并不那么简单。参见例如Is an atomic file rename (with overwrite) possible on Windows?。与讨论相关的还有How to safely write to a file? – 根据文件系统实现(及其挂载选项),元数据更改(重命名)可能在数据持久保存到文件之前完成。

    【讨论】:

    • 由于'FILENAME'文件已经在目录中,重命名操作是否会引发异常/错误?
    • 这适用于 Windows,是的。我已经更新了答案以明确这一点。
    • 非常感谢。但是我需要一个独立于平台的解决方案,因为我的脚本可以在 Windows 和 Linux 机器上运行。
    • 不过,我认为 Python 确保重命名操作在所有平台上都是原子操作
    • Python 3.3 有 os.replace() 可以满足您的需求。请参阅bugs.python.org/issue8828 中的讨论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2018-03-22
    相关资源
    最近更新 更多