pykentron
Python bindings for kentron, with a CadQuery-compatible API, so that CadQuery scripts run on kentron unchanged.
Installing
pip install pykentron # the kernel and pykentron's own CadQuery-like API
pip install "pykentron[cadquery]" # also what CadQuery's own layers need, to run CadQuery scripts
Python 3.10 or later. The wheels on PyPI are built for x86-64-v2 Linux machines (Intel from 2008, AMD from 2011; build from source with an empty RUSTFLAGS= for older ones).
Using it
import pykentron as cq
box = cq.Workplane("XY").box(10, 20, 30).faces(">Z").workplane().hole(5)
print(box.val().Volume())
To run CadQuery scripts unchanged, import pykentron.shim first: import cadquery then gives
CadQuery's own pure-Python layers (Workplane, Sketch, selectors, cqgi, free functions,
assemblies: copied unchanged from CadQuery v2.8.0, Apache-2.0, see
pykentron/cadquery_shim/cadquery/VENDORED.txt) on pykentron's shapes. Or run a script as it
is with pykentron-run script.py. Nothing named cadquery is installed, so a real CadQuery
beside pykentron is unaffected unless the shim is activated (the two cannot share one
process).
Code written against OCP, as libraries like cq_warehouse are, finds some of OCCT's names:
Shape.wrappedanswersTopoDS_Shape'sMoved,Located,Location(also placing the shape in place),Orientation,Oriented,Reversed,ShapeType,IsSame,IsEqual,IsPartner,IsNull;Vector.wrappedanswersgp_Vec's methods,Location.wrappedIsEqualandTransformation, andMatrix.wrappedTrsf();- the classes
BRepBuilderAPI_Copy,BRepBuilderAPI_Transform,BRepBuilderAPI_Sewing,BRepBuilderAPI_MakeFace(a face from a planar wire, or a face with holes added),ShapeUpgrade_UnifySameDomain,Bnd_BoxwithBRepBndLib.AddOptimal_s,BRepTools.UVBounds_sandClean_s, the emptyTopoDS_Shape(), theTopAbsnumbers and thegpclasses; - projections and fillings:
BRepProj_Projection(wires onto shapes, along a direction or from a point),BRepOffsetAPI_MakeFilling(faces spanning a loop of edges through points: the plate of least bending energy, asFace.makeNSidedSurfaceandinterpPlatemake),BRepOffset_MakeOffset(thickening a face into a solid),BRepIntCurveSurface_Interwithgce_MakeLin(where a line crosses a shape's faces),ShapeAnalysis_FreeBounds'ConnectEdgesToWires_swithTopTools_HSequenceOfShape,GeomAPI_IntSS(on the facesBRepAdaptor_Surfacestands for),BRepBuilderAPI_MakeEdgeandMakeWire,TopoDS' casts,ShapeFix_Face(keeping the face), andStdFail_NotDone(asValueError, what kentron's failures raise); occ_impl.shapes'downcast,fixandshapetype.
Other names, of pykentron or OCP, import but raise NotImplementedError when used.
Building from source
pip install ./crates/pykentron # with maturin, as the PyPI wheels are built
python3 crates/pykentron/build.py # in place, optimized (LTO), into python/pykentron/_kentron.abi3.so
python3 crates/pykentron/build.py --quick # in place, the tests' release profile
The in-place build installs the extension by renaming, so interpreters that have it loaded
keep running; put crates/pykentron/python on sys.path to use it. The CadQuery layers need
pyparsing, multimethod, runtype, typing_extensions and numpy (and nlopt, casadi
for constraints), as CadQuery does: the cadquery extra.
Memory and speed
Shapes no Python object refers to any more are collected from time to time, with the values
cached for them. Which allocator kentron's memory comes from is a profile, chosen by
PYKENTRON_PROFILE before pykentron is imported:
| profile | allocator | a complex five-part CadQuery model |
|---|---|---|
low-memory |
the system's | 316 MB at the peak, 3.7 s |
fast (default) |
mimalloc | 136% of the peak memory, ~16% faster |
pykentron.profile() gives the profile in use. The allocator is chosen once, at startup, so
the profile is only had through the variable (pykentron.set_profile(name) accepts only the
profile in use). balanced, a profile once between the two, is read as low-memory.
Building without the mimalloc feature (cargo build -p pykentron --no-default-features)
drops mimalloc and the fast profile (low-memory is then the default).
What is there
Workplane: sketching (polylines, lines, arcs, rectangles, circles, polygons, points, workplanes and transforms),extrude/cutBlind/revolve/box/cylinder, booleans,fillet, selection (faces,edges, ... with string selectors|,#,+,-,<,>,%TYPE), placement.- Shapes (
Vertex,Edge,Wire,Face,Shell,Solid,Compound): construction (boxes, cylinders, cones, spheres, tori, prisms, revolutions, lofts,offset2D, shell offsets and thick solids), booleans,clean, transforms and mirrors, queries (volume, area, length, centres, bounding boxes, validity, normals, geometry types,distance,isInside,tessellate). As in CadQuery, a shape's bounding box is tight until it is tessellated, then bounded by its meshes, widened by their deviation. - Files: STEP import and export (shapes, or an
Assemblywith names, colours and placements), BRep import and export, STL export. - Splines: interpolated, approximated (
makeSplineApprox, smoothed too, asparametricCurvemakes them), Bézier. Assembly,Location,Plane,Vector,Color(by OCCT's colour names, which are X11's),BoundBox.
Not yet: DXF import, SVG and other exporters, cadquery.vis.show (warns).
Checking it
tests/test_against_cadquery.pycompares pykentron with the real CadQuery case by case (run it with a Python that has CadQuery:PYTHON crates/pykentron/tests/test_against_cadquery.py).scripts/cadquery_build.py --project DIR MODULEruns a CadQuery project'sbuild()on pykentron and reports each part's volume, faces and validity;--oracleruns it on CadQuery instead.scripts/cadquery_sweep.py --project DIR --python PYTHONbuilds every module of a project both ways and checks that each part is valid and within 0.1% of CadQuery's volume (--oracle-cache FILEkeeps CadQuery's results, which do not change).scripts/cadquery_tests.pyruns CadQuery's own test suite (release v2.8.0, fetched from GitHub intotarget/cadquery-testswith a virtual environment of its own, made withuv) against pykentron, unchanged:python3 crates/pykentron/scripts/cadquery_tests.py [pytest arguments]. It fails on any test failing that is not intests/cadquery_baseline.txtand reports those of the baseline that pass;--update-baselinerecords the current failures. The suite reaches CadQuery's internals (cadquery.occ_impl.*,cadquery.func, OCP): the shim resolves those names to pykentron's where it has them, and makes the rest placeholders that raise NotImplementedError when used.tests/found/holds CadQuery scripts from public projects that pykentron failed on, built differently from CadQuery, or built much more slowly, with where each came from and what went wrong (cases.tsv), and the tools that found them (harness/: each script run on both, in fresh isolated processes, and compared).
Metadata
Release files for pykentron 0.13.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| pykentron-0.13.0.tar.gz | 1.9 MB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pykentron-0.13.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.10 | abi3 | Linux glibc 2.17+ x86-64 | Details |
Total release size: 6.1 MB
Release files / pykentron-0.13.0.tar.gz
| Download URL | pykentron-0.13.0.tar.gz |
|---|---|
| Size | 1.9 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
440319abd7e6ef63bd62c312d03cb1216540d2a6d46e5b96b4126b5c10053692
|
|
BLAKE2b-256 checksum How to use checksums |
b9ea5d72daa88cf9e2911af6aa4a78fd58047059304b10aa915dc66f39cd9630
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.
Transparency logRelease files / pykentron-0.13.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | pykentron-0.13.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 4.2 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
32bb5bbcd3b03e8cfd404cf372b5ed2a9a8ecf22a4abc6b78efb15f3f15d6ecb
|
|
BLAKE2b-256 checksum How to use checksums |
daa47a11ae207465e066673e7e384ef77ba205dbe4721734f653b07f4e5ac68f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.
Transparency logSecurity for pykentron 0.13.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for pykentron-0.13.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.