Tutorials on python scripting in pcbnew

This is really a great post, thank you so much for compiling this information.

Does anyone know of a similar post that focuses on the schematic side of things???

eeschema does not yet have a Python API, but there are some standalone Python wrappers for schematic and symbol libraries, e.g. https://github.com/KiCad/kicad-library-utils/blob/master/sch/sch.py

I tried to using the replicatelayout.py on the latest KiCad version on ubuntu (4.0.7) but it fails due to missing functions in the pcbnew.py. is there any chance to get it running on a stable release or does I have to wait for 5.0.0?

@Tojan Could you post the error message you’re getting?

I usually run on a Dev build but I should probably try using the stable PPA version (I’m guessing that’s what you have).

There is a nightly PPA as well

The kicad folks are pretty good about keeping the nightlies functional.

If you do try with a nightly and it still doesn’t work, then definitely let me know. Also, if you have test design I can try, I would love that too.

Due to work regulations it is not possible for me to work with the nightly build I’m afraid.

the error code is:

… )
Traceback (most recent call last):
File “”, line 1, in
File “/home/tojan/workspace/github/kicad_mmccoo/replicatelayout/replicatelayout.py”, line 151, in
File “/home/tojan/workspace/github/kicad_mmccoo/replicatelayout/replicatelayout.py”, line 97, in RegisterModulesAndNets
for net in board.GetNetsByNetcode().values():
File “/usr/lib/python2.7/dist-packages/pcbnew.py”, line 4806, in
getattr = lambda self, name: _swig_getattr(self, BOARD, name)
File “/usr/lib/python2.7/dist-packages/pcbnew.py”, line 83, in _swig_getattr
raise AttributeError("’%s’ object has no attribute ‘%s’" % (class_type.name, name))
AttributeError: ‘BOARD’ object has no attribute ‘GetNetsByNetcode’

As said I took a look into the pcbnew.py of the stable build and it seems like some functions and attributes you are using are missing there.

I have a new post on my kicad scripting blog. This one showcases some of the things you can do in scripting (If I were god, most of the editing functionality of pcbnew… most tools actually, would be writting in scripting languages. It would be much easier for folks to customize)


I’ve made a youtube showing all of the steps I used to generate this board:

which I drew mostly in fusion 360:

Here’s the video:

The post and the video don’t explain much about how the scripts work, but I do want to recommend a couple existing python libraries out there:

When playing around with the libraries below, remember that while they may return some cryptic data structure, you can often wrap that structure into a list(blah) call. Those structures are often/usually just a list and passing it to the list function gives you the kinds of lists you’ll fine more familiar.

The SciPy library is fantastic for graph algorithms like minimum spanning tree and delanay triangulation

The shapely library is very nice for polygon manipulation. Merging polygons, bloating and shrinking them… Designing layout is mostly geometric, so this is a nice tool to have in your pocket.

The dxf_grabber library is how I parse dxf files. Together with shapely, you can do a lot of import stuff.

I have a new post/youtube:
Kicad C++ walkthrough (adding python footprint APIs)

First, two important notes:

  • It came to my attention that kicad 4.0.7 is missing a bunch of python interface related stuff. From my experience, the nightlies available from the kicad download page are quite good and stable.
  • The first post of this thread has been converted to a wiki and I will use it as a sort of table of contents for this thread.

This time, I talk a bit about the c++ code of pcbnew, focusing on the parts that relate to the python interface.

I also have a related blog post, but it doesn’t really add anything.


I have a new video demonstrating some plugins I wrote for importing fusion360 DXF files. This is basically the same as my previous post, except “productized” as plugins.

The code for the plugins can be found here:

See the README on how to enable them in your env.

Hope you find it helpful.


3 posts were split to a new topic: Getting the area of the board

This post isn’t directly about scripting in pcbnew but is likely of interest to those running linux. In recent months, it’s been difficult/impossible for some to run pcbnew scripting at all due to seg faults.

I recommend running ubuntu 16.04 with the kicad nightly build

Ubuntu 18 and Linux Mint (based on ubuntu) expose some incompatibilities between Kicad and the libraries it depends on. Notably wxPython, but also wxWidgets and gtk. it’s a version mismatch thing.

As far as I understand it, the version mismatches have always been there, but we’ve gotten away with it. Recent distros have cleaned up which versions are installed to be more correct and it’s exposed our sins.

In my experience, the kicad team does a fantastic job in keeping the nightlies functional. In fact, because the official releases as so far between, it’s quite possible that the python scripts you find for pcbnew will not work on any official release. This is often the case with my own plugins. As I develop them, I discover that something is missing from the pcbnew API. So I implement it and submit a patch.

1 Like

I have a new video and some new code. This time it’s about a way to record the actions of a pcbnew plugin. It generates a file listing all of the pcbnew calls made and sourcing that file should produce the same output.

There are two use cases I had in mind.

  1. creating regression tests. The kicad team doesn’t want your plugin code (I assume they don’t) but plugins are a great way to test whether something in pcbnew’s python has changed. So Instead of running the plugin, run a journal of a run.

  2. Learning how someone did something. Maybe I want to do something similar to someone else’s plugin. Maybe that plugin has some sections that I just don’t understand. Perhaps the math is not relevant to what I want, maybe I’m a new programmer, a zillion reasons. I just want to know how they got pcbnew to do a thing.

The code can be found here on github:

Here’s a video demonstrating the code and how it works.

1 Like

I’m not 100% sure this post will be of interest to everyone, but…

I’ve been doing a fair bit with Boost’s c++ polygon and geometry libraries. These are libraries that enable one to manipulate polygons. merge, inflate, subtract. This can be useful for things like generating copper pours, design rule checking and more.

Since they’re c++ libraries (though the shapely is a wrapper around boost::geometry), they’re not directly python scripting. But since this thread is a clearing house of my writings, I’m adding it here.

I have other nerdly posting on my non-kicad blog: Using Boost polygon/geometry. Tutorial/tips/workarounds – Miles's Nerdy Thoughts

Here’s the video:


Hi @mmccoo, I’m getting an ‘internal server error’ when clicking on any of your links… Could you look into this? Thanks!!!

A post was split to a new topic: Manipulating Planes

iam creating a small plugin for pcbnew…i just want to get the path of the file currently opened in pcb new.since iam using os module of python to exectute some command, i need to change the directory to that particular path of file which is opened now in kicad.


Usually old threads get closed quickly after they’ve been dragged up.

This one seems worthy to be moved into the FAQ section after some sanitation.

I don’t know much about Python, and have never used it in KiCad, so I have not read much of this thread and can not help here.

Take a look at the already published action plugins. Most of them are listed here.

This post actually predates the FAQ. It is a WIKI. I think @ mmccoo did this post as a request from me in another thread. So, yeah. :wink:

iam using kifield library to export and import the schematic data to and fro from excel sheet.Iam having a problem where export command when triggered from python program is working, but import doesn’t.when i run these commands from command prompt both commands are working fine as expected.Iam using os module of python to trigger the commands.Any help would be highly appreciated.

  1. use os.path.dirname() to determine directory of the file
  2. you need spaces after -i and before -w arguments
  3. use subprocess module to run
1 Like