【发布时间】:2018-07-21 22:56:15
【问题描述】:
假设我有两个 Python 脚本。一个脚本是一个 Web 界面,使人们能够编辑配置文件。另一个脚本是根据该文件中定义的配置在后台执行各种操作的脚本,它会在循环中每隔几秒重新加载一次。
这样的配置文件有什么好的格式?我希望格式是人类可读和可编辑的,同时也易于写入和读取而不会发生冲突。
目前,我认为json 模块可能是一个不错的选择,它的配置本质上是将字典以明文形式保存到文件中,然后从该明文文件中读取到字典中。这是一种安全的方法吗?有更好的方法吗?是否会有问题是一个脚本尝试从文件中读取,而另一个脚本正在写入文件?应该如何解决?
所以,作为一个简单的例子,这里有两个脚本。一个将配置写入 JSON 明文文件,另一个从文件中读取配置:
作家
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)
阅读器
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)
应该如何解决?
【问题讨论】:
-
json 或 yaml...
-
@StephenRauch 谢谢。如前所述,这些如何应对一个脚本写入它们的同时另一个脚本从它们读取的情况?
-
它们只是文件。使用文件锁。
-
@StephenRauch 是否有一些标准库解决方案?我看到很多针对它的自制代码,但我想要一些简单、Pythonic 和安全的代码。
-
锁定是一个大而重要的问题。非常依赖环境。我不相信你会找到一个简单的现成答案。这些是数据库解决的一些问题。
标签: python json configuration semaphore