Blog JSystems - uwalniamy wiedzę!

Szukaj

click, w skrócie

Prosta aplikacja CLI:

import click

@click.command()
@click.option('--imie')
def hello(imie):
    click.echo(f'Czesc {imie}')

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
Szkolenie Python od podstaw, przez analizę danych, do machine learning w JSystems

Ten kurs daje Ci solidne podstawy Pythona. Jeśli chcesz pójść dalej i pod okiem trenera dojść od pierwszej linijki kodu do własnego modelu uczenia maszynowego, sprawdź nasze pięciodniowe szkolenie Python od podstaw, przez analizę danych, do machine learning. Pierwsze trzy dni to Python w praktyce: typy i kolekcje, instrukcje warunkowe i pętle, funkcje, moduły i pakiety, pliki tekstowe, usługi sieciowe oraz praca z bazą PostgreSQL. Czwarty dzień to analiza danych w pandas (wczytywanie CSV, TSV i XLS, filtrowanie, agregacje, statystyki) i wizualizacja w Matplotlib, Seaborn oraz Plotly. Piąty dzień to uczenie maszynowe w scikit-learn: regresja liniowa i logistyczna, drzewa decyzyjne, las losowy, XGBoost, walidacja predykcji, dobór hiperparametrów i przeciwdziałanie przeuczeniu. Szkolenie ma terminy gwarantowane, czyli odbywa się niezależnie od wielkości grupy.

Szkolenie Python od podstaw, przez analizę danych, do machine learning

To szkolenie może być dofinansowane dla Ciebie z KFS lub BUR.

★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Najczęściej zadawane pytania

Do czego służy moduł click w Pythonie?
Moduł click pozwala odbierać w skrypcie parametry przekazywane z linii poleceń. Zastępuje starszy i mniej intuicyjny moduł argparse. Konfiguruje się go dekoratorami, na przykład click.command oraz click.option, którymi opisujesz komendę i jej opcje.
Jak wymusić podanie parametru przez użytkownika?
Masz dwie opcje w dekoratorze click.option. Argument prompt=True sprawia, że przy braku wartości skrypt poprosi o jej wpisanie. Argument required=True powoduje, że przy braku parametru skrypt się nie uruchomi i wyświetli komunikat o brakującej opcji.
Jak przekazać do skryptu kilka parametrów naraz?
Dodaj kilka dekoratorów click.option nad funkcją, każdy dla osobnego parametru. Nazwy parametrów muszą pokrywać się z argumentami funkcji. Przy wywołaniu podajesz je w linii poleceń, a kolejność ich podawania nie ma znaczenia.
Czy click sam generuje pomoc do skryptu?
Tak, click automatycznie dodaje opcję help, która wyświetla pomoc. Treść opisu każdego parametru ustawiasz argumentem help w dekoratorze option. Po uruchomieniu skryptu z opcją help zobaczysz listę opcji wraz z ich opisami.
Jak bezpiecznie wczytać hasło w skrypcie CLI?
Użyj dekoratora option z argumentem hide_input=True, który ukrywa wpisywane znaki. Opcjonalnie dodaj confirmation_prompt=True, aby wymusić potwierdzenie wprowadzonej wartości. Dzięki temu nie musisz trzymać hasła jawnie w kodzie źródłowym.

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...