KiCad en headless : scripts Python et kicad-cli sans interface
Modifiez une board, lancez le DRC et exportez Gerber et perçage sans ouvrir KiCad : pcbnew en headless, kicad-cli et codes de sortie pour la CI.

« Headless », c’est faire travailler KiCad sans ouvrir son interface : sur un serveur d’intégration continue, dans un script de fabrication, ou pour traiter cinquante boards d’un coup. Deux outils se complètent : un script Python qui modifie la board, et kicad-cli qui vérifie et exporte. Toutes les commandes de cette page ont été lancées telles quelles sous Windows avec KiCad 10.0.
Modifier une board sans interface
Avec pcbnew, aucun process KiCad n’est nécessaire : le module charge le fichier .kicad_pcb en mémoire, vous le modifiez, puis vous le réenregistrez. Exemple qui remplit à nouveau toutes les zones :
import pcbnew
board = pcbnew.LoadBoard("demo.kicad_pcb")
for zone in board.Zones():
zone.SetLocalClearance(pcbnew.FromMM(0.3))
pcbnew.ZONE_FILLER(board).Fill(board.Zones())
pcbnew.SaveBoard("demo.kicad_pcb", board)
print("zones refilled:", len(board.Zones()))Lancez-le avec le Python fourni avec KiCad ("C:\Program Files\KiCad\10.0\bin\python.exe" refill_zones.py), sinon import pcbnew échoue : voir l’erreur No module named ‘pcbnew’.
⚠️ Testé : pcbnew.WriteDRCReport() fonctionne dans la console de KiCad, mais plante dans un script Python autonome (KiCad 10.0.6). En headless, lancez le DRC avec kicad-cli (ci-dessous).
L’API IPC reste un modèle client/serveur : il faut un process KiCad pour répondre. En headless, kipy peut le démarrer lui-même via kicad-cli :
from kipy import KiCad
with KiCad(headless=True, file_path="demo.kicad_pcb") as kicad:
board = kicad.get_board()
# ... mêmes appels qu'avec KiCad ouvert ...⚠️ Testé : headless=True demande KiCad 11 (ou les nightlies 10.99) et kicad-python 0.9.0 ou plus. Sur KiCad 10 stable, utilisez pcbnew ou kicad-cli. Détails dans le tutoriel d’installation.
Lancer le DRC et faire échouer la CI
kicad-cli est livré avec KiCad (dans le même dossier bin). Avec --exit-code-violations, le DRC renvoie un code de sortie différent de 0 dès qu’il trouve une violation — exactement ce qu’attend un pipeline de CI pour bloquer une modification :
kicad-cli pcb drc --exit-code-violations -o drc.rpt demo.kicad_pcb
Résultat réel sur une board propre (code 0), puis sur une copie à laquelle on a ajouté une piste qui viole une règle (code 5) : voir la capture en haut de page. Options utiles : --format json pour un rapport exploitable par un script, --severity-all pour inclure les avertissements, --refill-zones pour remplir les zones avant la vérification.
Exporter les Gerber et le perçage
kicad-cli pcb export gerbers --layers F.Cu,B.Cu,F.Mask,B.Mask,F.Silkscreen,Edge.Cuts -o fab/ demo.kicad_pcb
kicad-cli pcb export drill -o fab/ demo.kicad_pcb

Sans --layers, kicad-cli exporte toutes les couches de la board, y compris les couches User et Fab dont le fabricant n’a pas besoin.
Générer une image 3D de la board
Pratique pour une documentation ou un aperçu automatique dans une pull request :
kicad-cli pcb render -o board3d.png -w 1600 -h 1000 --quality high --perspective --rotate -38,0,18 demo.kicad_pcb

Pour aller plus loin
Le même enchaînement — script Python qui modifie, kicad-cli qui vérifie puis exporte — se transpose tel quel dans GitHub Actions ou GitLab CI. Pour piloter un KiCad déjà ouvert depuis un script externe, voyez comment activer l’API IPC.