Wróć na górę
Artykuły / Python

Workflow Pythona: od trybów uruchamiania po debugowanie w IDE

Autor: Joshua Henry 15 stycznia 2024 ok. 15 min czytania

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:

bash / cmd
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ć:

bash / cmd
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:

bash / PowerShell / cmd
# 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 break­pointy

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:

Python
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:

Python
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 – break­pointy zadziałają tylko, jeśli startujesz program w trybie debugowania, a nie zwykłego"Run”.
Poprzedni artykuł Brak wcześniejszego artykułu
Następny artykuł Praktyczne podejścia do zadań cyklicznych w Pythonie