Przejdź do treści

stack i tech

Python w automatyzacji: kiedy kod wygrywa z no-code.

n8n rozwiązuje 80 procent zadań automatyzacji bez linii kodu. Pozostałe 20 procent wymaga Pythona, bo no-code zaczyna albo generować dłuższy workflow, albo nie daje rady wydajnościowo. Oto kiedy sięgam po kod.

Ostatnia aktualizacja: 23 kwietnia 2026 Autor: Adrian Krawczyk

Kiedy warto wejść w Pythona

Cztery sygnały, że konkretny fragment automatyzacji zasługuje na Python zamiast n8n:

  • Operacje na danych tabelarycznych: jeśli workflow obrabiają setki albo tysiące wierszy naraz (grupowanie, pivot, joins, data cleaning), pandas w kilka linijek robi to, co w n8n wymagałoby rozbudowanego łańcucha node'ów Item Lists, Merge i Function nodes. Czas wykonania też jest o rząd wielkości krótszy.
  • Specyficzne biblioteki bez natywnego node'a: OpenPyXL do złożonych arkuszy Excel z formułami, Pandas-profiling do eksploracji, scikit-learn dla klasycznej klasyfikacji, imghdr do walidacji uploadowanych plików. n8n ma HTTP Request Node i Code Node, ale kiedy potrzebujesz dedykowanej biblioteki, tracisz więcej czasu na obejście niż na napisanie 50 linijek Pythona.
  • Custom node do integracji niszowych: polskie ERP-y (Comarch Optima, enova365, Subiekt GT) nie mają natywnych n8n node'ów. Napisanie custom node w Pythonie (przez n8n-nodes-custom z Python subprocess, albo jako osobny FastAPI microservice wołany z HTTP Request Node) daje kontrolę nad auth, retries i error handling, której ad-hoc webhook nie zapewni.
  • Przetwarzanie strumieni albo dużych plików: gdy musisz przetworzyć plik 500 MB (log serwera, export z CRM, historia transakcji) linia po linii, n8n włoży wszystko do pamięci i albo zamuli, albo padnie. Python ze yield, csv.DictReader i io.BytesIO przetwarza to strumieniowo, niezależnie od rozmiaru.

Code Node w n8n czyli Python in-line

n8n od wersji 1.x wspiera Python w Code Node (wcześniej tylko JavaScript). To najszybsza ścieżka do dodania Pythona do workflow bez wychodzenia z n8n:

  • Zalety: zero overheadu ops (nie trzeba deployować osobnego serwisu), dostęp do $json, $input.all() i innych zmiennych n8n, inherit credentials z poprzednich node'ów.
  • Ograniczenia: środowisko Pythona w n8n Code Node ma preinstalowane tylko podstawowe biblioteki (standard lib plus requests, numpy). Niestandardowe zależności wymagają budowy własnego Docker image n8n albo przejścia na microservice.
  • Kiedy używam Code Node: proste transformacje danych (regex, formatowanie dat, parsowanie JSON), walidacje (czy email ma sens, czy NIP się zgadza z checksumą), lookup w lokalnych słownikach kodów.

Uwaga na runOnceForEachItem vs runOnceForAllItems

Code Node ma dwa tryby. runOnceForEachItem dostaje po jednym itemie na iterację i musi zwrócić pojedynczy obiekt. runOnceForAllItems dostaje tablicę wszystkich itemów i zwraca tablicę. Wybór niewłaściwego trybu daje nieoczywiste błędy (typu "A 'json' property isn't an object"), bo n8n oczekuje innego formatu zwrotki. Regułka: jeśli operacja jest per-item bez kontekstu innych, runOnceForEachItem. Jeśli agregacja, join, albo sortowanie, runOnceForAllItems.

FastAPI jako microservice dla n8n

Drugi wzorzec: Python FastAPI microservice stojący obok n8n, wołany przez HTTP Request Node. Używam tego dla:

  • Cięższych obliczeń: OCR faktur z Document AI albo Tesseract, klasyfikacja tekstu z wyuczonym modelem, obróbka obrazów z Pillow. Te operacje trzymam w osobnym kontenerze, żeby nie pakować wszystkich bibliotek do image'u n8n.
  • Stanu między wywołaniami: jeśli workflow wymaga cache w pamięci (np. słownik kodów walidowany co godzinę), mikroserwis trzyma go w Redisie albo lokalnej strukturze, n8n tylko pyta o wynik.
  • Integracji z niszowymi API: polskie ERP-y, systemy medyczne, API telcoów. Napisanie FastAPI wrapper'a wokół nich daje customowy layer abstrakcji, który n8n używa jak zwykłego webhook'a.

Typowy stack FastAPI microservice:

  • FastAPI jako framework (lekki, szybki, async-first, OpenAPI out-of-the-box).
  • Pydantic do walidacji request i response.
  • httpx albo aiohttp do wywołań zewnętrznych API (async).
  • structlog albo standardowy logging z JSON formatter dla centralnego logowania.
  • pytest plus httpx.AsyncClient do testów integracyjnych.

Python standalone, bez n8n

Są scenariusze, w których n8n przestaje być wartościowy dodatek:

  • Skrypty batchowe uruchamiane raz dziennie albo rzadziej: cron-driven obróbka 100 plików na S3, raport z bazy wysyłany raz w tygodniu do stakeholderów. Prosty Python skrypt w Docker image z harmonogramem Kubernetes CronJob albo Cloud Scheduler jest czytelniejszy i tańszy niż workflow w n8n.
  • Data pipeline z kilku etapów ETL: ingest z kilku baz, czyszczenie, transformacje, push do data warehouse. n8n da radę, ale Apache Airflow albo dbt są do tego celu zaprojektowane i zespoły data engineerów znają je lepiej. Nie walczę z ich stackiem, tylko integruję.
  • Badania ad-hoc dla analityki: jupyter notebook z pandas, matplotlib i sqlalchemy do drążenia problemu. n8n nie jest do tego stworzony, choć Code Node czasem uprościł mi eksplorację.

Biblioteki, których używam najczęściej

Short-lista, do której wracam najczęściej w projektach automatyzacyjnych:

  • Dane: pandas (tabele), polars (szybszy pandas dla dużych zbiorów), openpyxl (Excel z formułami i stylami), python-docx (Word), pypdf2 (PDF).
  • HTTP i API: httpx (sync plus async), requests (legacy kiedy muszę), tenacity (retries z exponential backoff).
  • OCR i obrazy: pytesseract (wrapper nad Tesseract), google-cloud-documentai (Vertex Document AI), Pillow (manipulacja obrazów).
  • AI i LLM: google-cloud-aiplatform (Vertex AI), openai (OpenAI SDK), sentence-transformers (lokalne embeddingi).
  • Baza i cache: psycopg2-binary albo asyncpg (PostgreSQL), pgvector (vector search), redis-py.
  • Security: cryptography, pyjwt, passlib, argon2-cffi dla hashingu haseł jeśli budujesz auth.

Pułapki, w które wpadają klienci

Rzeczy, które regularnie widzę i które kosztują czas jeśli nikt nie ostrzegł:

  • Dependency hell w n8n Code Node: chcesz zainstalować bibliotekę X, okazuje się że nie ma jej w środowisku, budujesz custom image, build failuje bo brakuje system package'a. Jeśli więcej niż 30 minut tracisz na zależności, migruj kod do FastAPI microservice.
  • Blocking IO w async kontekście: Python async (FastAPI, aiohttp) wymaga async-wrappers dla IO. Wywołanie requests.get(...) w async funkcji zablokuje event loop. Użyj httpx.AsyncClient albo await asyncio.to_thread(...).
  • Brak timeoutów na HTTP: requests.get(url) bez timeout= czeka w nieskończoność. Każde wywołanie zewnętrzne ma mieć explicit timeout (connect timeout 5s, read timeout 30s dla zwykłych API, więcej dla LLM calls).
  • JSON field z nieprzewidzianymi kluczami: zewnętrzne API czasem zmieniają format response. Używaj Pydantic modeli z extra='allow' w development, extra='forbid' w production, żeby wcześnie zobaczyć nieoczekiwane pola.
  • Nie commit'owanie requirements.txt albo pyproject.toml: bez lockfile'a kolejny developer dostaje inne wersje zależności. Używaj pip-tools albo Poetry dla produkcyjnego Pythona.

Najczęstsze pytania

Czy muszę znać Pythona, żeby wdrożyć automatyzację u mnie?

Nie. Większość scenariuszy n8n rozwiązuje bez linii kodu, a ja jako wdrożeniowiec piszę Python gdzie trzeba. Od Ciebie potrzebuję tylko kogoś, kto ogarnie logikę procesu biznesowego. Jeśli chcesz samodzielnie rozszerzać workflow, uczyć się Pythona nie jest pilne, można zacząć od n8n UI.

Czy robisz szkolenia z Pythona dla zespołów?

Robię mentoring 1:1 albo w małych grupach, pokazując konkretne wzorce (custom n8n nodes, FastAPI microservices, pandas dla automatyzacji). Nie prowadzę kursu Python 'od zera do pro', bo są na to lepsi specjaliści. Mentoring ma sens dla zespołu, który już ma podstawy Pythona i potrzebuje pragmatycznego przewodnika po automatyzacji.

Kiedy lepiej napisać custom n8n node niż mikroserwis Pythona?

Custom node jeśli funkcjonalność wielokrotnie wraca w różnych workflow (np. dedykowana integracja z polskim ERP używana w 5 workflow). Mikroserwis jeśli funkcjonalność jest scoped do jednego use case (np. OCR konkretnego typu dokumentów) albo wymaga ciężkich zależności (modeli ML), których nie chcesz w image'u n8n.

Czy Python async (FastAPI, async def) jest tego wart?

Tak, jeśli mikroserwis obsługuje wiele równoczesnych requests i waits na zewnętrzne API (większość workflow tak robi). Async daje wyraźnie więcej throughputu per instance. Koszt: trudniejsze debugowanie (stack traces gorsze), potrzeba async-wrappers dla każdego IO. Dla prostych skryptów batchowych sync Python wystarczy.

Jakie wersje Pythona używasz w produkcji?

Minimum Python 3.11 (type hints są już dojrzałe, błędy jaśniejsze), preferuję 3.12 dla nowych projektów. Pythona 3.10 i starszego unikam w nowych wdrożeniach, Python 2 nie ma szans. Dla FastAPI microservices zwykle 3.12 z Poetry jako package manager.

Chcesz pogadać o konkretnym projekcie?

Warsztat otwierający to 90 minut, zdalnie albo w Poznaniu, bez zobowiązań. Mówimy, czy Twój proces nadaje się do automatyzacji i w jakiej skali.

napisz do mnie →