Skip to content

pymmcore-plus/pymmcore-nano

Repository files navigation

pymmcore-nano

License PyPI Python Version CI codecov

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!

Installation

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)

For Developers

Clone repo

git clone https://github.com/pymmcore-plus/pymmcore-nano.git
git submodule update --init

Setup dev environment (editable install)

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)

Test

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

Releasing

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

Updating mmCoreAndDevices source code

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