Blog JSystems - z miłości do programowania

Moduł click – obsługa parametrów z linii poleceń



Stosowanie parametrów


Moduł „click” pozwala odbierać od użytkownika parametry przekazywane do skryptu. Dawniej był stosowany moduł „argparse” do tego samego celu, jednak był niewygodny i mało intuicyjny toteż obecnie używany jest raczej „click”. Zacznijmy od prostego skryptu przyjmującego jeden parametr.


import click
@click.command()
@click.option('-i')
def witacz(i):
     print(f'Witaj {i}')
witacz()


To jest cała zawartość mojego pliku app.py. Funkcja witacz raczej nie należy do złożonych – przyjmuje przez argument imię osoby którą ma powitać. Magia dzieje się dzięki dekoratorom @click.command() i @click.option(). Pierwsza informuje moduł click że funkcja witacz jest przez niego obsługiwana. Drugi określa nazwę parametru którego użyjemy przy wywoływaniu skryptu – nazwa tego parametru musi się pokrywać z nazwą parametru wywoływanej funkcji. Wywołanie skryptu:


python app.py -i Andrzej


Efekt na konsoli:


Witaj Andrzej


Jeśli podkusiła Cię ciekawość i sprawdziłeś co się stanie jeśli nie podamy parametru, to zobaczyłeś:


Witaj None


Oczywiście nie jest to efekt jaki chcielibyśmy uzyskać. Jak więc zmusić click do żądania wartości tego parametru w przypadku jego niepodania? Do dekoratora @click.option dodajemy jeszcze argument „prompt”. W przypadku nie podania wartości dla parametru zostaniemy o to poproszeni:


import click
@click.command()
@click.option('-i',prompt=True)
def witacz(i):
    print(f'Witaj {i}')
witacz()


Alternatywnie możemy zastosować argument „required”:


import click
@click.command()
@click.option('-i',required=True)
def witacz(i):
    print(f'Witaj {i}')
witacz()


Różnica sprowadza się do tego, że w pierwszym przypadku zostaniemy poproszeni o podanie wartości dla argumentu, w drugim dostaniemy komunikat tego typu:


Usage: app.py [OPTIONS]


Try 'app.py --help' for help.


Error: Missing option '-i'.


A skrypt nie jest uruchamiany.


Stosowanie wielu parametrów


Aby zastosować wiele argumentów na raz wystarczy dodać kilka dekoratorów @click.option:


import click
@click.command()
@click.option('-i')
@click.option('-n')
def witacz(i,n):
    print(f'Witaj {i} {n}')
witacz()


Skrypt wywołujemy tak:


python app.py -i Andrzej -n Klusiewicz


Efekt na konsoli:


Witaj Andrzej Klusiewicz


Kolejność podawania parametrów nie ma znaczenia.


Automatyczne generowanie pomocy


Click automatycznie dodaje parametr „—help”, po zastosowaniu którego wyświetla się pomoc. Treść pomocy deklarujemy przy użyciu argumentu dekoratora option w ten sposób:


import click
@click.command()
@click.option('-i',help='Imię witanej osoby')
@click.option('-n',help='Nazwisko witanej osoby')
def witacz(i,n):
    print(f'Witaj {i} {n}')
witacz()


Wywołanie skryptu w ten sposób:


python app.py –help


Spowoduje wyświetlenie pomocy:


Usage: app.py [OPTIONS]


Options:


-i TEXT Imię witanej osoby


-n TEXT Nazwisko witanej osoby


--help Show this message and exit.


Wprowadzanie haseł


Przykład znaleziony w dokumentacji, ale jest tak fajny że postanowiłem go tu umieścić ku uciesze administratorów 😉. Często pojawiający się w pracy (mojej) problem to tajność haseł pojawiających się w kodzie źródłowym. Można ten problem rozwiązać na kilka sposobów, ale jednym z nich jest wykorzystanie funkcjonalności modułu click. Wyobraźmy sobie że w skrypcie jest jawnie zawarte hasło do bazy danych. Zamiast je podawać jawnie, możemy nie tylko przyjąć je przez parametr, ale jednocześnie ukryć wprowadzane znaki. Ukrywanie wprowadzanych znaków zapewnia nam argument „hide_input”. Możesz też (opcjonalnie) wykorzystać argument „confirmation_prompt” który powoduje konieczność potwierdzenia wprowadzonej wartości. Bardzo wygodne w sytuacjach gdy nasz skrypt ma na przykład ustawiać jakieś hasło.


import click
@click.command()
@click.option('--password',prompt=True,confirmation_prompt=True,hide_input=True)
def connectDatabase(password):
     print(f'connecting to database. Url: user/{password}@jsystems.pl/databaseName')
connectDatabase()


Efekt działania powyższego kodu:


python app.py


Password:


Repeat for confirmation:


connecting to database. Url: user/moje_haslo@jsystems.pl/databaseName

Przyjdź do nas na szkolenie z języka Python! Mamy szereg szkoleń w ofercie, od podstawowych po aplikacje webowe z użyciem Django, analizę danych, tesowanie, machine learning i wiele innych.
Sprawdź dostępne szkolenia Python
Zapisz się do newslettera aby otrzymywać najnowsze świeżynki pojawiające się na blogu!