Hoe argparse te gebruiken om python-scriptparameters te ontleden

  • Noah Scott
  • 0
  • 4092
  • 1133
>

Doelstelling

Leer de argparse-module te gebruiken om eenvoudig python-scriptparameters te ontleden

Voorwaarden

  • Basiskennis van python en objectgeoriënteerde concepten

Moeilijkheidsgraad

GEMAKKELIJK

Conventies

  • # - vereist dat gegeven linux-commando's worden uitgevoerd met root-privileges, hetzij direct als rootgebruiker, hetzij door gebruik van sudo opdracht
  • $ - vereist dat gegeven linux-commando's worden uitgevoerd als een gewone niet-geprivilegieerde gebruiker

Invoering

In een vorig artikel hebben we gezien hoe je opdrachtregelargumenten kunt ontleden met behulp van getopts in de context van bash-scripts (je kunt het artikel hier vinden). Nu zullen we zien hoe we dezelfde taak op een krachtigere manier kunnen uitvoeren bij het schrijven van een python-script.

Initialiseer de parser

Om ons doel te bereiken, gaan we een python-module gebruiken genaamd argparse. Het laat ons onze opdrachtregelparameters specificeren, en zal automatisch het script help-bericht op basis daarvan genereren. Dus laten we beginnen, we zullen ons script "printerscript.py" noemen:
#! / usr / bin / env python import argparse if __name__ == '__main__': # Initialiseer de parser parser = argparse.ArgumentParser (description = "eenvoudig script om argparse gebruik aan te tonen")
Het eerste dat u moet doen, is natuurlijk het argparse module. Daarna gaan we verder met het initialiseren van de parser. De Omschrijving trefwoord, doorgegeven aan de parser-constructor is optioneel, maar stelt ons in staat om een ​​korte beschrijving van het script toe te voegen wanneer het helpbericht wordt weergegeven.
Er zijn andere sleutelwoorden die we kunnen gebruiken om het gedrag van de parser verder aan te passen: bijvoorbeeld het epiloog trefwoord kunnen we een tekst geven die moet worden weergegeven na het hoofdhulpbericht, of door prog we kunnen de naam specificeren van het programma dat in dezelfde context moet worden weergegeven (standaard wordt sys.argv [0] gebruikt).

Een positionele parameter toevoegen

Nu is het tijd om onze eerste positionele parameter aan het script toe te voegen. In dit geval zullen we de parameter "printme" toevoegen, dat is de string die zal worden afgedrukt door ons testscript. We bereiken dit door de add_argument () methode van het parser-object dat we hierboven hebben geïnitialiseerd:
parser.add_argument ('printme', help = "De te printen string")
Het eerste argument dat we aan de methode hebben verstrekt, is de naam van de parameter, en het tweede, optioneel, is helpen. Met behulp van dit sleutelwoord kunnen we de beschrijving specificeren voor de parameter die wordt weergegeven in het helpbericht dat wordt gegenereerd door argparse.
Het is belangrijk op te merken dat de parameters standaard als strings worden beschouwd: om een ​​ander gegevenstype te specificeren, moeten we de type trefwoord. Als we bijvoorbeeld wilden dat ons argument werd geconverteerd naar een geheel getal, hadden we het op deze manier gespecificeerd:
parser.add_argument ('printme', type = int)
Nadat we onze parameter hebben toegevoegd, moeten we de parse_args () methode van het parserobject. Deze methode retourneert een exemplaar van de argparse.Namespace class: de geparseerde parameters worden opgeslagen als attributen van deze instantie. Ten slotte kunnen we een regel toevoegen om de variabele af te drukken. Op dit punt zou het script er als volgt uit moeten zien:
#! / usr / bin / env python import argparse if __name__ == '__main__': # Initialiseer de parser parser = argparse.ArgumentParser (description = "eenvoudig script om argparse gebruik aan te tonen") # Voeg de positionele parameter parser.add_argument (' printme ', help = "De string die moet worden afgedrukt") # Parseer de argumenten arguments = parser.parse_args () # Print tenslotte de doorgegeven string print (arguments.printme)
Laten we het uitvoeren:
 $ ./printerscript.py "hallo wereld!" Hallo Wereld! 
De string die we hebben gepasseerd, is afgedrukt, is verwacht. Maar wat als we het niet hebben verstrekt? Het helpbericht zou zijn weergegeven, waarin het correcte gebruik van het script wordt beschreven:
 $ ./printerscript.py gebruik: printerscript.py [-h] printme printerscript.py: fout: te weinig argumenten 


Een optionele parameter toevoegen

Optionele parameters zijn niet verplicht voor het gebruik van het script, maar worden gebruikt om het gedrag ervan te wijzigen. Argparse herkent ze als het ziet dat er koppeltekens in de beschrijving staan, dus bijvoorbeeld:
parser.add_argument ('-r', '--repeat', help = "aantal keren om de string af te drukken", type = int, default = 1)
De naam van de parameter wordt voorafgegaan door koppeltekens (we kunnen zowel de korte als de lange parameterversie specificeren). In dit geval hebben we de optionele parameter toegevoegd --herhaling die specificeert hoe vaak de string moet worden afgedrukt. We hebben ook de standaard trefwoord. Dit is erg belangrijk, omdat we hierdoor de waarde kunnen specificeren die het attribuut aanneemt als de parameter niet expliciet wordt opgegeven bij het aanroepen van het script.
Op dit punt, om te controleren of de parameter werkt zoals verwacht, hoeven we alleen maar ons script aan te passen om het afdrukken van de string het opgegeven aantal keren te herhalen, daarom voegen we de afdrukken() functioneren in een beetje for loop:
voor i binnen bereik (0, arguments.repeat): print (arguments.printme) 
Laten we het proberen:
 $ ./printerscript.py --repeat = 3 "hallo wereld!" Hallo Wereld! Hallo Wereld! Hallo Wereld! 
Alles ging zoals verwacht. Bovendien is het helpbericht ook bijgewerkt en bevat nu een beschrijving van de nieuwe optionele parameter:
 ./printerscript.py --help gebruik: printerscript.py [-h] [-r REPEAT] printme eenvoudig script om argparse gebruik te demonstreren positionele argumenten: printme De af te drukken string optionele argumenten: -h, --help toon dit helpbericht en verlaat -r REPEAT, --repeat REPEAT aantal keren om de string af te drukken 
Zoals hierboven gezegd, wanneer argparse ziet dat een parameter wordt voorafgegaan door koppeltekens, neemt het aan dat het optioneel is. Om dit gedrag te wijzigen en het als verplicht te "verklaren", kunnen we de verplicht trefwoord bij het toevoegen van de parameter, in de vorm: required = True.

Het trefwoord "dest"

Normaal gesproken wordt de waarde die voor een parameter is opgegeven, opgeslagen als een attribuut met de naam van het eerste argument dat aan de add_argument () method in het geval van positionele parameters, of de eerste lange string optie (met de koppeltekens verwijderd: de --repeat string wordt het 'herhaal' attribuut) in het geval van optionele parameters. In het laatste geval, als een lange stringoptie niet beschikbaar is, wordt de korte gebruikt. De dest trefwoord stelt ons in staat om een ​​aangepaste attribuutnaam op te geven in plaats van op dit gedrag te vertrouwen.

Het trefwoord "actie"

Bij gebruik van de add_argument () methode kunnen we het gedrag specificeren dat moet worden gebruikt voor de geparseerde opties door een ander trefwoord te gebruiken: actie. De standaardactie is om de doorgegeven waarde toe te wijzen aan het corresponderende attribuut. In het geval van ons kleine script, bijvoorbeeld de waarde die is opgegeven voor de --herhaling parameter, wordt toegewezen aan het 'herhaal'-attribuut van het argparse.Namespace class zodra de argumenten zijn geparseerd. Dit gedrag kan echter ook worden gewijzigd. Laten we de andere hoofdopties kort beschrijven:
store_true en store_false
Door deze actie te specificeren, zeggen we in feite dat de parameter geen argument vereist: Klopt wordt toegewezen als de waarde aan het overeenkomstige attribuut als de optie is opgegeven, of Vals anders-. store_true en store_false geeft respectievelijk een standaardwaarde van Klopt en Vals.
store_const
Dit is vergelijkbaar met de bovenstaande optie, maar door het te gebruiken als een waarde voor de actie trefwoord, in plaats van een booleaanse waarde, een constante waarde wordt aan het attribuut toegewezen als de parameter wordt gebruikt. Deze waarde wordt zelf gespecificeerd door de const trefwoord:
parser.add_argument ("- random-option", action = "store_const", const = uwwaarde)
toevoegen
Als toevoegen wordt gebruikt als waarde van de actie trefwoord, wordt een lijst gemaakt en ernaar verwezen door het corresponderende parameterattribuut: de opgegeven waarde wordt eraan toegevoegd. Dit is handig als de parameter meer dan eens wordt opgegeven:
parser.add_argument ('- random-option', action = "append")
append_const
Net als bij gebruik toevoegen, een waarde wordt toegevoegd aan de lijst waarnaar wordt verwezen door het parameterattribuut. Het verschil is dat in dit geval de waarde niet door de gebruiker wordt opgegeven, maar wordt gedeclareerd bij het toevoegen van de parameter, opnieuw via de const trefwoord:
parser.add_argument ('--randomoption', action = "append_const", const = "de waarde die moet worden toegevoegd")

Wederzijds exclusieve optionele parameters

In bepaalde situaties kunnen we sommige opties elkaar wederzijds uitsluiten. De argparse module kunnen we deze taak op een zeer eenvoudige manier uitvoeren. Wat we in feite gaan doen, is een aparte groep opties maken met behulp van de add_mutually_exclusive_group () methode van het parserobject, en voeg onze argumenten eraan toe. Bijvoorbeeld:
parser = argparse.ArgumentParser (); # maak onze groep van elkaar uitsluitende argumenten mutually_exclusive = parser.add_mutually_exclusive_group () mutually_exclusive.add_argument ("- foo", help = "foo exclusief bar") wederzijds_exclusive.add_argument ("- bar", help = "bar sluit foo uit" )
Een ding om op te merken is dat deel uitmaken van een wederzijds_exclusieve_groep argumenten moeten optioneel zijn, daarom positionele argumenten, of argumenten die je hebt gedefinieerd zoals vereist (required = True) zijn er niet in toegestaan.
Op dit punt zou u een idee moeten hebben van hoe argparse werken. We hebben echter alleen maar de oppervlakte bekrast van wat deze module te bieden heeft: voor een volledige beschrijving van al zijn functionaliteiten, ga je gang en lees de documentatie, je zult er geen spijt van krijgen. Leuke scripting!



Niemand heeft nog op dit artikel gereageerd.

Een verzameling nuttige informatie over het Linux-besturingssysteem en nieuwe technologieën
Nieuwe artikelen, praktische tips, gedetailleerde recensies en handleidingen. Voel je thuis in de wereld van het Linux-besturingssysteem