A parancssori argumentumok elemzése Pythonban

Python-szkripteket szeretne futtatni parancssori argumentumokkal? Ismerje meg, hogyan lehet parancssori argumentumokat elemezni sys, getopt és argparse modulokkal a Pythonban.

A Pythonban, ha a felhasználói bevitelben szeretne olvasni, az input() függvényt kell használnia. Egyes alkalmazásoknál azonban előfordulhat, hogy át kell adni bizonyos argumentumokat, miközben a parancssort futtatja a parancssorban.

Ebben az oktatóanyagban megtanuljuk, hogyan lehet Python-szkriptet futtatni a parancssorban lévő opciókkal és argumentumokkal. Ezután megtanuljuk, hogyan használhatjuk a Python beépített moduljait az ilyen opciók és argumentumok elemzésére.

Kezdjük!

A sys.argv megértése Pythonban

Ha C nyelven programozott, akkor tudja, hogy az argumentumok átadásának egyik legegyszerűbb módja a parancssoron keresztül. Ehhez a fő funkciót a következőképpen strukturálhatja:

#include<stdio.h>

int main(int argc, char **argv){
    //argc: argument count
    //argv: argument vector
    
    //do something on the args

    return 0;
}

Itt az argc az argumentumszámot, az argv pedig az argumentumvektort jelenti.

Python-szkriptek futtatása parancssori argumentumokkal

A Pythonban futtathatja a Python-szkriptet a parancssorban a python3 fájlnév.py használatával. Ilyenkor tetszőleges számú parancssori argumentumot is átadhat:

$ python3 filename.py arg1 arg2 ... argn

A sys modul azonnali támogatást nyújt ezeknek a parancssori argumentumoknak a elérésére és feldolgozására. A sys.argv az összes parancssori argumentum listája, amelyet a Python-szkript futtatásakor átadunk.

Íme egy példa, ahol a main.py fájlt parancssori argumentumokkal futtatjuk:

$ python3 main.py hello world python script

Az argumentumvektort egy egyszerű for ciklus és enumerate függvény segítségével hajthatjuk végre:

# main.py

import sys

for idx, arg in enumerate(sys.argv):
    print(f"arg{idx}: {arg}")
# Output
arg0:main.py
arg1:hello
arg2:world
arg3:python
arg4:script

Látjuk, hogy az első argumentum (a 0 indexnél) a Python fájl neve. A következő érvek pedig az 1-es indextől kezdődnek.

Ez egy minimális munkaprogram, amely elfogadja és feldolgozza a parancssori argumentumokat. Azonban látunk néhány problémát:

  • Honnan tudják a program felhasználói, hogy milyen érveket adjanak át?
  • És mit támasztanak ezek az érvek?

Ez nem egészen világos. Ennek megoldására használhatja a getopt vagy az argparse modulokat. És ezt megtudjuk a következő részekben.✅

Parancssori argumentumelemzés Python getopt használatával

Tanuljuk meg, hogyan lehet parancssori argumentumokat elemezni a beépített getopt modul segítségével.

A getopt getopt modulból történő importálása után megadhatja az elemezni kívánt argumentumokat, valamint a szkript futtatásához szükséges rövid és hosszú opciókat. A sys.argv 1. indexétől kezdődő összes argumentumot elemezni kell. Tehát az elemezni kívánt szelet a sys.argv[1:].

  iTunes számítógép nem engedélyezett hiba

Itt szükségünk lesz egy üzenet karakterláncra és fájlnévre. Használjuk az m-t és az f-t rövid opcióként, az üzenetet és a fájlt pedig hosszú opcióként.

De hogyan biztosíthatjuk, hogy egy adott lehetőséghez érv szükséges?

  • A rövid opciókban beállíthatja, hogy egy opció argumentumot igényeljen, ha a rövid opció neve után kettőspontot (:) ad meg.
  • Hasonlóképpen a hosszú opcióknál a hosszú opció után egy = jelet adhatunk hozzá. Meg tudjuk ragadni ezeket a lehetőségeket és a hozzájuk tartozó érveket.

Ezeket hozzáadva a következő kódot kapjuk a main.py fájlban:

# main.py

import sys
from getopt import getopt

opts, args = getopt(sys.argv[1:],'m:f:',['message=","file="])

print(opts)
print(args)

Itt az opts változó tartalmazza az opciókat és az argumentumokat sorok listájaként. Minden más, általunk átadott pozicionális argumentum az args változóban lesz összegyűjtve.

A szkript futtatásához átadhatjuk az üzenetet és a fájlnevet, és használhatjuk a rövid vagy a hosszú opciókat.

A main.py futtatása a hosszú opciók használatával a következőket kínálja:

$ python3 main.py --message hello --file somefile.txt

Az opciók és argumentumok sorokban vannak az opts változóban. Mivel nem haladtunk át egyetlen pozíciós érvben sem, az args egy üres lista.

# Output
[("--message', 'hello'), ('--file', 'somefile.txt')]
[]

Ezzel egyenértékűen használhatjuk az alábbi rövid opciókat is:

$ python3 main.py -m hello -f somefile.txt
# Output
[('-m', 'hello'), ('-f', 'somefile.txt')]
[]

⚠️ Ebben a példában a -m short opció nem tévesztendő össze a parancssori -m jelzővel, amely egy modul fő modulként való futtatására szolgál Python-szkript futtatásakor.

Például a python3 -m unittest main.py parancsot használja a unittest fő modulként való futtatásához a main.py futtatásakor.

Említettük, hogy az összes többi pozíciós argumentumot, amelyet átadunk, az args változóban gyűjtjük össze. Íme egy példa:

$ python3 main.py -m hello -f somefile.txt another_argument

Az args lista tartalmazza a másik_argumentum pozíció argumentumot.

# Output
[('-m', 'hello'), ('-f', 'somefile.txt')]
['another_argument']

Itt az opts a sorok listája. Így végigcsikorolhatjuk, kicsomagolhatjuk a tuple-t, és kihúzhatjuk az adott opcióknak megfelelő argumentumokat.

De mit tegyünk a fájlnévvel és az üzenettel, miután feldolgoztuk ezeket az argumentumokat? Megnyitjuk a fájlt írási módban, és a nagybetűsre konvertált üzenetet írjuk a fájlba.

# main.py
import sys
from getopt import getopt

opts, args = getopt(sys.argv[1:],'m:f:',['message=","file="])

print(opts)
print(args)

for option, argument in opts:
    if option == "-m':
        message = argument
    if option == '-f':
        file = argument

with open(file,'w') as f:
    f.write(message.upper())

Futtassa a main.py fájlt a rövid opciókkal és parancssori argumentumokkal.

$ python main.py -m hello -f thisfile.txt
[('-m', 'hello'), ('-f', 'thisfile.txt')]
[]

A main.py futtatása után a munkakönyvtárunkban láthatjuk a „thisfile.txt” fájlt. Ez tartalmazza a „hello” karakterláncot nagybetűssé alakítva („HELLO”).

$ ls
main.py  thisfile.txt
$ cat thisfile.txt
HELLO

A parancssori argumentumok elemzése az Argparse segítségével

A Python szabványos könyvtárába is beépített argparse modul lehetőséget biztosít parancssori argumentumok elemzésére és parancssori felületek létrehozására is.

  Hogyan indítsuk újra a szigetet az „Animal Crossing: New Horizons” című filmben

A parancssori argumentumok elemzéséhez importáljuk az ArgumentParser osztályt az argparse modulból. Itt példányosítottuk az arg_parser-t, egy ArgumentParser objektumot:

from argparse import ArgumentParser

arg_parser = ArgumentParser()

Ezután két parancssori argumentumot szeretnénk hozzáadni:

  • üzenet: az üzenet karakterlánc, és
  • fájl: annak a fájlnak a neve, amellyel dolgozni szeretnénk.

Most meghívjuk az add_argument() metódust az arg_parser-en mindkét argumentum hozzáadásához. Az add_argument() metódushívásban súgót állíthatunk be egy karakterlánchoz (az argumentum leírásához).

arg_parser.add_argument('message',help='message string')
arg_parser.add_argument('file',help='filename')

Eddig példányosítottuk az arg_parser-t, és hozzáadtuk a parancssori argumentumokat. Amikor a program a parancssorban fut, az arg_parser parse_args() metódusával lekérheti az argumentumok értékét.

Itt rögzítjük az argumentum névterét az args változóban. Tehát az args.argument_name segítségével lekérheti az argumentumok értékét.

Az argumentumok értékének beszerzése után a fájlba írjuk az üzenetsort kis- és nagybetűk felcserélésével (a swapcase() string metódussal).

args = arg_parser.parse_args()

message = args.message
file = args.file

with open(file,'w') as f:
     f.write(message.swapcase())

Mindezt összeadva, íme a main.py fájlunk:

# main.py

from argparse import ArgumentParser

arg_parser = ArgumentParser()
arg_parser.add_argument('message',help='message string')
arg_parser.add_argument('file',help='filename')

args = arg_parser.parse_args()
print(args)

message = args.message
file = args.file

with open(file,'w') as f:
     f.write(message.swapcase())

A parancssori argumentumok használatának megértése

Az argumentumok használatának megértéséhez a main.py futtatásakor használhatja a –help long opciót, ahogy az ábrán látható:

$ python3 main.py --help
usage: main.py [-h] message file

positional arguments:
  message     message string
  file        filename

optional arguments:
  -h, --help  show this help message and exit

Nincsenek opcionális argumentumok, és mind az üzenet, mind a fájl kötelező pozíció argumentumok. Alternatív megoldásként használhatja a rövid -h opciót is:

$ python3 main.py -h
usage: main.py [-h] message file

positional arguments:
  message     message string
  file        filename

optional arguments:
  -h, --help  show this help message and exit

Amint látható, mindkét argumentum alapértelmezés szerint pozicionális argumentum. Tehát ha nem ad át egy vagy több érvet, akkor hibákba ütközik.

Itt átadtunk egy pozíció argumentumot (Hello) az üzenet karakterlánchoz, de nem adtunk meg értéket a fájl argumentumhoz.

És hibaüzenetet kapunk, amely szerint a fájl argumentum szükséges.

$ python3 main.py Hello
usage: main.py [-h] message file
main.py: error: the following arguments are required: file

Ha a main.py-t mindkét pozíciós argumentummal futtatjuk, azt látjuk, hogy az args névtér tartalmazza az argumentumok értékeit.

$ python3 main.py Hello file1.txt
# Output
Namespace(file="file1.txt", message="Hello")

Ha most megvizsgáljuk a jelenlegi munkakönyvtár tartalmát, azt látjuk, hogy a szkript létrehozza a ‘file1.txt’ fájlt:

$ ls
file1.txt  main.py

Az eredeti üzenetsor a ‘Hello’; a kis- és nagybetűk felcserélése után a ‘file1.txt’ fájl üzenetsora ‘helLO’.

$ cat file1.txt
hELLO

A parancssori argumentumok opcionálissá tétele

Ha ezeket a parancssori argumentumokat nem kötelezővé szeretné tenni, akkor az argumentum nevének elé írhatja a – karaktert.

  A bejegyzések archiválása vagy archiválása az Instagramon

Módosítsuk a main.py fájlt úgy, hogy az üzenet és a fájl argumentumait is opcionálissá tegyük.

# main.py

from argparse import ArgumentParser

arg_parser = ArgumentParser()
arg_parser.add_argument('--message',help='message string')
arg_parser.add_argument('--file',help='filename')

Mivel a parancssori argumentumok nem kötelezőek, ezekhez az argumentumokhoz alapértelmezett értékeket állíthatunk be.

if args.message and args.file:
    message = args.message
    file = args.file
else:
    message="Python3"
    file="myfile.txt"

Ezen a ponton a main.py fájl a következő kódot tartalmazza:

# main.py

from argparse import ArgumentParser

arg_parser = ArgumentParser()
arg_parser.add_argument('--message',help='message string')
arg_parser.add_argument('--file',help='filename')

args = arg_parser.parse_args()
print(args)

if args.message and args.file:
    message = args.message
    file = args.file
else:
    message="Python3"
    file="myfile.txt"

with open(file,'w') as f:
     f.write(message.swapcase())

Ha ellenőrizzük a használatot, azt látjuk, hogy az üzenet és a fájl is opcionális argumentum. Ez azt jelenti, hogy mostantól mindkét argumentum nélkül futtathatja a main.py fájlt.

$ python3 main.py --help
usage: main.py [-h] [--message MESSAGE] [--file FILE]

optional arguments:
  -h, --help         show this help message and exit
  --message MESSAGE  message string
  --file FILE        filename
$ python3 main.py

Az argumentum névtérben a fájl és az üzenet is Nincs.

# Output
Namespace(file=None, message=None)

Azt látjuk, hogy az alapértelmezett fájlnév és üzenet: „sajatfájl.txt” és „Python3”. A ‘myfile.txt’ fájl most a munkakönyvtárban található:

$ ls
file1.txt  main.py  myfile.txt

És tartalmazza a „Python3” karakterláncot a felcserélt betűk kis- és nagybetűivel:

$ cat myfile.txt
pYTHON3

Használhatja a –message és a –file argumentumot is, hogy olvashatóbbá tegye a parancsot.

$ python3 main.py --message Coding --file file2.txt
# Output
Namespace(file="file2.txt", message="Coding")

Látjuk a ‘file2.txt’ fájlt a munkakönyvtárban:

$ ls
file1.txt  file2.txt  main.py  myfile.txt

És a várt módon tartalmazza a ‘CODING’ karakterláncot.

$ cat file2.txt
cODING

Következtetés

Íme egy összefoglaló az oktatóanyagban tanultakról:

  • A C programozási nyelvhez hasonlóan a Pythonban is elérheti a parancssori argumentumokat a sys.argv argumentumvektoron keresztül. sys.argv[0] a Python szkript neve. Tehát a sys.argv argumentumok elemzése érdekel bennünket[1:].
  • Az olvashatóság javítása és az opciók hozzáadásához azonban használhatja a getopt és az argparse modulokat.
  • A getopt modul segítségével elemezheti a parancssori argumentumok listáját az 1. indextől kezdve a lista végéig. Megadhat rövid és hosszú opciókat is.
  • Ha egy opció argumentumot vesz fel, megadhat egy kettőspontot (:) és = a rövid és a hosszú opció után.
  • A Python argparse moduljával létrehozhat egy ArgumentParser objektumot, és az add_argument() metódussal hozzáadhat egy szükséges pozíciós argumentumot. Használja — az argumentum neve előtt, hogy opcionális legyen.
  • A parancssori argumentumok értékeinek lekéréséhez hívja meg a parse_args() metódust az ArgumentParser objektumon.

Ezután tanulja meg, hogyan hajthat végre biztonságos kivonatolást Pythonban.