python ConfigArgParse Hinweis ~ Verwalten Sie die Argumente und Konfigurationsdateien immer noch separat? ~

Es war mühsam, die Befehlszeilenargumente und die Parameter der Einstellungsdatei separat zu verwalten. Daher dachte ich, es wäre gut, einen Parser zu finden, der beide gleichzeitig verwalten kann, und überprüfte ihn daher.

ConfigArgParse https://github.com/bw2/ConfigArgParse

Wird es benutzt?

Wenn es nicht zu oft verwendet wird, ist es EOL, also überprüfen Sie es leicht

~$ apt-cache rdepends python3-configargparse
python3-configargparse
Reverse Depends:
  python3-certbot
  snakemake
  bdfproxy
  python3-azure-devtools
  prometheus-pgbouncer-exporter
  cloudprint

Das wichtigste ist "cerbot", ein Client von Let's Encrypt, oder "bdfproxy" für Sicherheitsleute, nicht wahr?

Unterstützte Formate

Überprüfen Sie auch die unterstützten Formate.

# how to specify a key-value pair (all of these are equivalent):
name value     # key is case sensitive: "Name" isn't "name"
name = value   # (.ini style)  (white space is ignored, so name = value same as name=value)
name: value    # (yaml style)
--name value   # (argparse style)

Stellen Sie sicher, dass das Leerzeichen, das INI-Format und das Yaml-Format standardmäßig unterstützt werden. Ich war froh, wenn es wenn möglich ein JSON-Format gab, aber es ist gut, weil es dem Yaml-Stil entspricht, der in einem Radius von 5 m am häufigsten verwendet wird.

Installation

Die Testumgebung ist Ubuntu 19.04 Die neueste Version ist ab dem 1. Oktober 2019 0.14.0 (13. Januar 2019) Upstream, aber ich möchte keine Sicherheitspatches usw. in Betrieb nehmen, daher werde ich das Paket der oben genannten Distribution verwenden.

$ sudo apt install python3-configargparse
$ dpkg -l python3-configargparse
Anfrage=(U)Unbekannt/(I)Installation/(R)Löschen/(P)完全Löschen/(H)Aufbewahrung
|Status=(N)Nichts/(I)Eingerichtet/(C)Aufbau/(U)Einsatz/(F)Aufbau失敗/(H)Halbinstalliert/(W)
|/Error?=(Leer)Nichts/(R)Neuinstallation erforderlich(Status,Großbuchstabe des Fehlers=Abnormal)
||/Name Version Architekt Beschreibung
+++-======================-============-============-===========================
ii python3-configargparse 0.13.0-1 all replacement for argparse wi
lines 1-6/6 (END)

Testcode

#!/usr/bin/env python3

import configargparse

def parse_args():
    cp = configargparse.ArgumentParser(
        default_config_files=['./.arg_parse.yaml']
    )
    cp.add_argument(
        '-c', '--conf',
        dest='config',
        is_config_file=True,
        help='config file path',
    )
    cp.add_argument(
        '-f', '--flag',
        dest='flag',
        action="store_true",
        help='true or false flag'
    )
    cp.add_argument(
        '-s', '--str',
        type=str,
        required=True,
        dest='string',
        help='requirement string'
    )
    cp.add_argument(
        '-i', '--int',
        type=int,
        dest='intager',
        default=50,
        help='default intager',
    )
    cp.add_argument(
        '-a', '--array',
        dest='array',
        action='append',
        default=[],
        help='array parama',
    )
    return cp.parse_args()
              
def main():
    args = parse_args()
    print(args)

main()

Einstellungsdatei (Beispiel für ein Yaml-Format)

$ cat .arg_parse.yaml
str: hogehoge
int: 3
array: [1, 12, 35, 40]

Ausführungsergebnis 1 Nur Datei einstellen

$ ./test_conf.py
Namespace(array=['1', '12', '35', '40'], config=None, flag=False, intager=3, string='hogehoge')

Ausführungsergebnis 2 Wenn sowohl die Konfigurationsdatei als auch das Befehlszeilenargument verwendet werden

$ ./test_conf.py -i 1111 -s fugafuga -f
Namespace(array=['1', '12', '35', '40'], config=None, flag=True, intager=1111, string='fugafuga')

Verschiedene Punkte

  1. Der Parametername der Einstellungsdatei ist der "int" -Teil von "--int" und nicht der von dest angegebene "intager".
  2. Wenn der Typ int verwendet wird, wird er als Zeichenfolge verarbeitet, sofern nicht "type = int" eingegeben wird. Wenn Sie den str-Typ angeben möchten, müssen Sie ebenfalls "type = str" verwenden. Ich dachte es wäre, aber selbst wenn ich eine Zahl in das Argument setze, wird es als Zeichenfolge verarbeitet.
  3. "action = 'append'" ist erforderlich, wenn list als Argument verwendet wird.
  4. Wenn Sie einen booleschen Wert als Argument verwenden, ist "action = 'store_true'" oder "action = 'store_false'" erforderlich.

"Store_true" ist standardmäßig "False" und "store_false" ist standardmäßig "True". Ich war verwirrt darüber, ob es das Gegenteil war, aber es scheint gut zu glauben, dass es wahr bzw. falsch sein wird, wenn es durch Befehlszeilenargumente angegeben wird.

Impressionen

Ich finde es schön, argparse und configparse getrennt zu verwalten und nicht süchtig danach zu sein, nur eine zu ändern.

Recommended Posts

python ConfigArgParse Hinweis ~ Verwalten Sie die Argumente und Konfigurationsdateien immer noch separat? ~
Was vergleichst du mit Python und ==?
Hinweise zum Schreiben von Konfigurationsdateien für Python Hinweis: configparser
Python Hinweis: Stellen Sie fest, ob das Befehlszeilenargument in der Liste enthalten ist