什么是一个好的Python配置文件格式,可以轻松安全地由一个脚本编辑并由另一个脚本读取?

问题描述 投票:0回答:1

假设我有两个Python脚本。一个脚本是一个Web界面,使人可以编辑配置文件。另一个脚本是基于该文件中定义的配置在后台执行各种操作的脚本,它在循环中每隔几秒重新加载一次。

这种配置文件的格式是什么?我希望这种格式具有人类可读性和人性化的可编辑性,同时也易于编写和读取而不会发生冲突。

目前,我认为json模块可能是一个不错的选择,其中配置本质上是以明文形式保存到文件中的字典,并从该明文文件读入字典。这是一种安全的方法吗?有更好的方法吗?是否有问题是一个脚本试图从文件中读取而另一个脚本正在写入文件?该如何解决?

所以,作为一个简单的例子,这里有两个脚本。一个配置写入JSON纯文本文件,一个从文件中读取配置:

writer

import random

import json

while True:
    config = {"a": 1, "b": random.randint(1, 2)}
    with open("config.json", "w") as file_config:
        json.dump(config, file_config)

reader

import json

while True:
    with open("config.json") as file_JSON:
        config = json.load(file_JSON)
    print(config)

当这两个脚本同时运行时,阅读器脚本会快速生成以下错误:

Traceback (most recent call last):
  File "2_script.py", line 5, in <module>
    config = json.load(file_JSON)
  File "/usr/lib/python3.5/json/__init__.py", line 268, in load
    parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
  File "/usr/lib/python3.5/json/__init__.py", line 319, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python3.5/json/decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python3.5/json/decoder.py", line 357, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

该如何解决?

python json configuration semaphore
1个回答
0
投票

听起来你正在寻找两个功能:

  1. 人类可读的配置文件
  2. 支持一个进程写入文件,而其他人正在阅读它

我不知道这两个功能的简单解决方案,但我可以提出一些建议。

  1. 对您的平台进行文件锁定的一些研究。这可能是获得你想要的最佳选择。
  2. 考虑使用SQLite数据库而不是人类可读的配置文件。 SQLite supports多个读者和一个编写者进程。您可以编写命令行工具来转储配置以供用户查看。
  3. 尝试一个“足够好”的解决方案,尝试读取文件,并处理读取不完整文件的任何问题。要考虑的一些技巧是添加“文件结束”标记或检查总和以确保您没有读取不完整的文件,以及在临时名称下编写文件,然后将其重命名为活动名称。失败后,睡觉并重试。
  4. 在进程之间进行通信,以便在可以安全地读取文件时通知它们,或者只是将配置数据直接发送到每个进程。如果Web服务启动后台进程,则可以使用队列或进程池。或者,他们可以通过命名管道进行通信。

至于格式,我会考虑三个选项:1。INI格式 - 老式,但内置的configparser模块支持2. YAML格式 - 我比JSON更喜欢它,因为它支持注释3. JSON格式 - 流行,但不支持注释:您必须使用特殊属性名称,如“注释”或在解析文件之前删除注释

© www.soinside.com 2019 - 2024. All rights reserved.