Experimental python bindings for CMMCore (the device abstraction layer for micro-manager) using nanobind.
This package can be used as a (mostly) drop-in replacement for pymmcore
.
There are a few slight differences in behavior. You are encouraged to try it where you might use
pymmcore; and let us know if you run into any issues!
pip install pymmcore-nano
Versioning is the same as for pymmcore.
MMCoreMajor.MMCoreMinor.MMCorePatch.DeviceInterface.pymmcore-nano-build
For example, the version 11.3.0.71.2
refers to:
- MMCore version 11.3.0
- Device interface 71
- pymmcore-nano build number of 2 (this is a zero indexed version that resets each time the MMCore or Device Interface versions increment)
git clone https://github.com/pymmcore-plus/pymmcore-nano.git
git submodule update --init
Make sure you have uv installed: https://docs.astral.sh/uv/getting-started/installation/
This project uses just
as a task runner.
If you have just
installed (e.g. brew install just
), you can fully setup the project with:
just install
If you prefer not to install just
globally, you can install it with the rest of the
project dependencies using uv. Then activate the environment and call just install
uv sync --no-install-project
. .venv/bin/activate # Windows: .venv\Scripts\activate
just install
This repo contains a few device adapters that are useful for testing, in src/mmCoreAndDevices/DeviceAdapters. These adapters are built as a part of the installation.
On windows, in order to build the SequenceTester device (optional) you will also
need boost installed (e.g. choco install boost-msvc-14.3
, or similar version
according to your version of visual studio)
Regardless of whether the environment is active, you can run:
just test
or, if the environment is active and you have already run just install
pytest
To release a new version:
- update the
PYMMCORE_NANO_VERSION
value in_pymmcore_nano.cc
- run
just version
- commit changes to main
- run
just release
Rather than using git submodules, this repository checks in the
mmCoreAndDevices
source
code. This makes measuring C++ code coverage easier, as the mmCoreAndDevices
code is included in the same repository (see codecov results
here),
and it also makes it easier to make changes to the mmCoreAndDevices
code
directly from this repository (e.g., to fix bugs or add features that are
pending in the upstream repo).
To bring in new changes from the upstream mmCoreAndDevices
repository, you can
run two scripts:
python scripts/update_sources.py
python scripts/patch_sources.py
The first script (update_sources.py
) will update the src/mmCoreAndDevices
directory with the latest changes from the mmCoreAndDevices
repository,
overwriting any changes in the local repo.
The second script (patch_sources.py
) replays all of the changes that we
want to make to the sources in order to build the project. This includes changes
to the CMakeLists.txt
files. This essentially means that all changes to the
source MUST be patch_sources.py
, which serves as a nice record of changes that
should be upstreamed.
After running these scripts, you can test the build and python code as usual.
just build
pytest