在运行时基于argparser参数更新YAML配置文件



我有一个.yml配置文件,它根据我运行程序的客户端控制程序的所有文件I/O。客户端名称应该位于YAML文件中给定的路径中的某个位置,例如:

client: CLIENT_1
data:
raw-file-path: D://Users//product//data//raw//CLIENT_1//CLIENT_1_data.csv
processed-data-file-path: D://Users//product//data//processed//CLIENT_1//CLIENT_1_processed_data.csv

有多个客户端,它们的数据始终位于命名的子目录中。我的代码接收每个客户端的原始数据,并在适当的目录中生成处理后的数据,如上面的示例所示。在大多数情况下,我想为单个客户端运行脚本,这样我就可以编辑我显示的config.yml文件,但我希望能够以编程方式进行编辑。我在ArgumentParser中添加了一个--clients参数:parser.add_argument('--clients', nargs='+', default=[], help='list of clients'),以允许将客户端列表作为输入,例如python run.py --config config.yml --clients CLIENT_1 CLIENT_2

我想找到一种方法来操作所有这些路径,以指向适当的目录,甚至利用f字符串之类的东西命名文件,但我不知道如何做到这一点。我发现的最接近的问题是:用Yaml文件利用Python f字符串?,但它指的是我不熟悉的Jinja2模板。有更简单的方法吗?

有一个Python包可以从YAML/JSON/dicts智能地构建对象,并且正在积极开发和扩展中。(完整披露,我是这个包的合著者,请参阅此处(

此外,还有一些传入参数的选项,请参阅此

然后你可以在你的YAML:中定义它

some_field: _|arg_name|_

并像这样加载:

test_conf_yaml = PickleRick('./tests/placebos/test_config.yaml', arg_name='hallo world')

安装:

pip install pickle-rick

用途:

定义一个YAML或JSON字符串(或文件(。

BASIC:
text: test
dictionary:
one: 1
two: 2
number: 2
list:
- one
- two
- four
- name: John
age: 20
USERNAME:
type: env
load: USERNAME
callable_lambda:
type: lambda
load: "lambda: print('hell world!')"
datenow:
type: lambda
import:
- "from datetime import datetime as dd"
load: "lambda: print(dd.utcnow().strftime('%Y-%m-%d'))"
test_function:
type: function
name: test_function
args:
x: 7
y: null
s: hello world
any:
- 1
- hello
import:
- "math"
load: >
def test(x, y, s, any):
print(math.e)
iii = 111
print(iii)
print(x,s)
if y:
print(type(y))
else:
print(y)
for i in any:
print(i)

然后将其用作对象。

>> from pickle_rick import PickleRick
>> config = PickleRick('./config.yaml', deep=True, load_lambda=True)
>> config.BASIC.dictionary
{'one' : 1, 'two' : 2}
>> config.BASIC.callable_lambda()
hell world!

您可以定义Python函数,从其他文件或RESTAPI、环境变量加载额外的数据,然后再次将所有内容写入YAML或JSON。

当构建需要结构化配置文件的系统时,或者在笔记本电脑中作为交互式结构时,这种方法尤其有效。

使用此功能有一个安全注意事项。只加载受信任的文件,因为任何代码都可以执行,因此不要只加载任何内容,而不知道完整的内容是什么

该软件包名为PickleRick,可在以下位置获得:

  • 文档

最新更新