Niezależnie od tego, czy dopiero uczysz się Pythona, czy utrzymujesz produkcyjne wdrożenia, na co dzień zderzasz się z
konfiguracją środowisk, błędami importu i"polowaniem na bugi”. W społeczności bardzo często powtarza się ten sam schemat:
źle ustawione zmienne środowiskowe, konflikt zależności i debugowanie wyłącznie za pomocą print().
W tym wpisie przejdziemy od podstawowego zrozumienia, jak Python jest uruchamiany, przez budowanie czystego środowiska (na przykładzie VS Code), aż po praktyczne użycie debuggera w nowoczesnych IDE (VS Code, PyCharm), loggingu i kilku elementów dobrej inżynierii oprogramowania.
I. Trzy główne sposoby uruchamiania Pythona
W materiałach w sieci łatwo się pogubić między terminalem, IDLE, konsolą w IDE czy Jupyter Notebookiem. Dla uproszczenia możemy to sprowadzić do trzech mechanizmów uruchamiania:
1. Tryb interaktywny (Interactive mode)
Po poprawnym ustawieniu Pythona w PATH możesz w terminalu wpisać po prostu python (lub
python3) i wejść do powłoki oznaczonej zachętą >>>. Wpisane tam instrukcje są
wykonywane od razu. Wbudowane IDLE czy Python Console w PyCharm/VS Code opierają się na tym samym mechanizmie,
tylko owiniętym w ładniejszy interfejs.
Uwaga: Jupyter Notebook wygląda inaczej (pliki .ipynb, interfejs WWW), ale pod spodem również wysyła kod
do uruchomienia w interpreterze i zwraca wynik – to po prostu wygodniejsza forma trybu interaktywnego.
2. Uruchamianie skryptów (.py)
Najczęstszy sposób pracy to zapis kodu w pliku tekstowym z rozszerzeniem .py i uruchamianie:
python main.py
Rolą IDE jest ułatwienie pisania tego pliku: podpowiedzi, linting, formatowanie, uruchamianie i debugowanie bez ręcznego wpisywania komendy za każdym razem.
3. Polecenia jednolinijkowe (python -c)
Dla krótkich testów albo skryptów automatyzujących możesz użyć:
python -c "print('hello from one-liner')"
W codziennej pracy aplikacyjnej to raczej ciekawostka, ale bywa przydatne przy testowaniu obrazów dockera, CI/CD czy prostych zadań administracyjnych.
II. Czyste środowisko: VS Code + wirtualne środowiska
Największą miną dla początkujących jest globalna instalacja wszystkiego"na raz”. Różne projekty potrzebują różnych wersji bibliotek – jeśli wszystkie trzymasz w jednym globalnym środowisku, prędzej czy później skończy się to konfliktem zależności. Dlatego standardem jest używanie wirtualnych środowisk.
1. Instalacja Pythona
Ściągnij aktualną wersję z oficjalnej strony (np. 3.13.x). Na Windows podczas instalacji koniecznie zaznacz "Add python.exe to PATH”. Nowsze wersje (3.9+) nie wspierają już Windows 7 i starszych.
2. VS Code + rozszerzenie Pythona
W VS Code zainstaluj oficjalne rozszerzenie"Python” od Microsoftu. Razem z nim doinstalowany będzie debugger
oparty o debugpy – to on odpowiada za działanie trybu debugowania.
3. Tworzenie i aktywacja wirtualnego środowiska
W terminalu VS Code (Ctrl + `) w katalogu projektu:
# utwórz środowisko .venv w bieżącym katalogu
python -m venv .venv
# Windows – aktywacja
.venv\Scripts\activate
# Linux / macOS – aktywacja
source .venv/bin/activate
Po aktywacji przed znakiem zachęty w terminalu pojawi się (.venv) – od tego momentu
pip install będzie instalował paczki tylko w tym katalogu.
4. Powiązanie interpretera z projektem
W VS Code: Ctrl + Shift + P →"Python: Select Interpreter” i wybierz ścieżkę do
.venv. Od tego momentu uruchamianie i debugowanie z menu VS Code powinno korzystać
z tego izolowanego środowiska.
Typowy problem: jeśli po instalacji paczek wciąż widzisz ModuleNotFoundError, to najczęściej znaczy,
że edytor nadal używa globalnego Pythona zamiast tego z .venv. Sprawdź interpreter w lewym dolnym rogu.
III. Zamiast print(): rdzeń debugowania w IDE
print() do szybkiego sprawdzenia czegoś jest OK, ale przy większych projektach zaczyna szkodzić –
zaśmieca logi, łatwo o zostawione"śmieci” w kodzie. Debugger wbudowany w VS Code / PyCharm pozwala dużo
szybciej zrozumieć, co się dzieje w programie.
1. Breakpointy i pojedyncze kroki
Klikasz na marginesie obok numeru linii – pojawia się czerwony punkt (breakpoint). Uruchamiasz program w trybie debugowania (ikona"robaka” albo F5/F9 w zależności od IDE) i wykonanie zatrzymuje się na tej linii.
- Step over – wykonaj bieżącą linię, nie wchodząc do wywoływanych funkcji.
- Step into – wejdź do wnętrza wywoływanej funkcji.
- Step out – dokończ aktualną funkcję i wróć do miejsca wywołania.
2. Podgląd zmiennych, Watch, Evaluate
W zatrzymanym programie masz w panelu Variables wszystkie zmienne z aktualnego zasięgu.
Jeśli interesuje Cię tylko kilka z nich, możesz dodać je do Watch, a przy bardziej złożonych
wyrażeniach użyć Evaluate Expression (np. sprawdzić wynik a + b * c bez
dopisywania tego do kodu).
3. Warunkowe breakpointy
Jeśli błąd pojawia się dopiero przy 99. iteracji pętli, ręczne klikanie"Continue” 98 razy nie ma sensu.
Wtedy użyj warunku (np. i == 99 albo user_id == "admin") – debugger zatrzyma się
tylko, gdy warunek będzie spełniony.
IV. Logging, wyjątki i dalej w stronę produkcji
1. Logging zamiast przypadkowych print()
Dla usług działających na serwerze logi są często jedynym źródłem prawdy o tym, co się wydarzyło.
Zamiast ręcznie wpisywać print(), lepiej od razu używać modułu logging:
import logging
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s",
)
def process_data(data):
logging.debug("Ta linia przyda się głównie w trakcie developmentu")
logging.info("Start przetwarzania danych, długość: %s", len(data))
# ... logika przetwarzania ...
Dzięki poziomom logowania (DEBUG, INFO, WARNING, ERROR, CRITICAL) możesz w produkcji łatwo ograniczyć ilość logów bez grzebania w kodzie.
2. Obsługa wyjątków (try / except)
Nieobsłużony wyjątek zwykle kończy się crashem aplikacji. Lepsze jest przechwycenie konkretnego typu błędu i sensowna reakcja:
def calculate_ratio(a, b):
try:
result = a / b
return result
except ZeroDivisionError:
logging.error("Dzielenie przez zero – sprawdź dane wejściowe.")
return None
finally:
logging.info("Funkcja calculate_ratio zakończyła działanie.")
Dobrą praktyką jest łapanie konkretnych wyjątków (np. ZeroDivisionError), a nie
wszystkiego jak leci przez except Exception:, który potrafi ukryć realne błędy.
3. Testy i profilowanie
Zamiast polować na regresje ręcznie, opłaca się od początku pisać testy jednostkowe (np. w
pytest). Przy problemach z wydajnością zamiast"na oko” zgadywać, co jest wolne,
warto użyć cProfile lub narzędzi typu line_profiler – pokażą,
które funkcje/linie naprawdę zjadają czas.
4. Kilka punktów kontrolnych, o których łatwo zapomnieć
-
PATH i instalacja Pythona – jeśli system nie widzi polecenia
python, sprawdź, czy podczas instalacji zaznaczyłeś dodanie do PATH i czy terminal/IDE zostały ponownie uruchomione. -
Czy IDE na pewno używa
.venv– aktywacja środowiska w terminalu nie wystarczy, jeśli VS Code / PyCharm nadal mają przypięty globalny interpreter. - Tryb debug vs zwykłe uruchomienie – breakpointy zadziałają tylko, jeśli startujesz program w trybie debugowania, a nie zwykłego"Run”.