PyLabRobot is a hardware agnostic, pure Python library for liquid handling robots, plate readers, pumps, scales, heater shakers, and other lab automation equipment. Read the paper in Device.
Advantages over proprietary software:
- Cross-platform: PyLabRobot works on Windows, macOS, and Linux. Many other interfaces are Windows-only.
- Universal: PyLabRobot works with any supported liquid handling robot, plate reader, pump, scale, heater shaker, etc. through a single interface.
- Fast iteration: PyLabRobot enables rapid development of protocols using atomic commands run interactively in Jupyter notebooks or the Python REPL. This decreases iteration time from minutes to seconds.
- Open-source: PyLabRobot is open-source and free to use.
- Control: With Python, you have ultimate flexibility to control your lab automation equipment. You can write Turing-complete protocols that include feedback loops.
- Modern: PyLabRobot is built on modern Python 3.9+ features and async/await syntax.
- Fast support: PyLabRobot has an active community forum for support and discussion, and most pull requests are merged within a day.
Liquid handling robots (docs)
PyLabRobot enables the use of any liquid handling robot through a single universal interface, that works on any modern operating system (Windows, macOS, Linux). We currently support Hamilton STAR, Hamilton Vantage, Tecan Freedom EVO, and Opentrons OT-2 robots, but we will soon support many more.
Here's a quick example showing how to move 100uL of liquid from well A1 to A2 using firmware on Hamilton STAR (this will work on any operating system!):
frompylabrobot.liquid_handlingimportLiquidHandlerfrompylabrobot.liquid_handling.backendsimportSTARBackendfrompylabrobot.resourcesimportDeckdeck=Deck.load_from_json_file("hamilton-layout.json")
lh=LiquidHandler(backend=STARBackend(), deck=deck)
awaitlh.setup()
awaitlh.pick_up_tips(lh.deck.get_resource("tip_rack")["A1"])
awaitlh.aspirate(lh.deck.get_resource("plate")["A1"], vols=100)
awaitlh.dispense(lh.deck.get_resource("plate")["A2"], vols=100)
awaitlh.return_tips()To run the same protocol on an Opentrons, use the following:
frompylabrobot.liquid_handling.backendsimportOpentronsOT2Backenddeck=Deck.load_from_json_file("opentrons-layout.json")
lh=LiquidHandler(backend=OpentronsOT2Backend(host="x.x.x.x"), deck=deck)Or Tecan (also works on any operating system!):
frompylabrobot.liquid_handling.backendsimportEVOBackenddeck=Deck.load_from_json_file("tecan-layout.json")
lh=LiquidHandler(backend=EVOBackend(), deck=deck)We also provide a browser-based Visualizer which can visualize the state of the deck during a run, and can be used to develop and test protocols without a physical robot.
Plate readers (docs)
Moving a plate to a ClarioStar using a liquid handler, and reading luminescence:
frompylabrobot.plate_readingimportPlateReader, CLARIOstarBackendpr=PlateReader(name="plate reader", backend=CLARIOstarBackend(), size_x=1, size_y=1, size_z=1)
awaitpr.setup()
# Use in combination with a liquid handlerlh.assign_child_resource(pr, location=Coordinate(x, y, z))
lh.move_plate(lh.deck.get_resource("plate"), pr)
data=awaitpr.read_luminescence()For Cytation5, use the Cytation5 backend.
Centrifuges (docs)
Centrifugation at 800g for 60 seconds with an Agilent VSpin:
frompylabrobot.centrifugeimportCentrifuge, VSpinBackendvspin_backend=VSpinBackend(device_id="YOUR_FTDI_ID_HERE")
cf=Centrifuge(name="centrifuge", backend=vspin_backend, size_x=1, size_y=1, size_z=1)
awaitcf.setup()
awaitcf.spin(g=800, duration=60)For a HighRes Biosolutions MicroSpin, use the MicroSpin factory:
frompylabrobot.centrifugeimportMicroSpincf=MicroSpin(name="microspin", host="192.168.127.60")
awaitcf.setup()
awaitcf.backend.home()
awaitcf.spin(g=800, duration=60)Pumps (docs)
Pumping at 100 rpm for 30 seconds using a Masterflex pump:
frompylabrobot.pumpsimportPumpfrompylabrobot.pumps.cole_parmer.masterfleximportMasterflexp=Pump(backend=Masterflex())
awaitp.setup()
awaitp.run_for_duration(speed=100, duration=30)Scales (docs)
Taking a measurement from a Mettler Toledo scale:
frompylabrobot.mettler_toledoimportMTSICSDriverscale=MTSICSDriver(port="/dev/cu.usbserial-110")
awaitscale.setup()
weight=awaitscale.read_weight()Heater shakers (docs)
Setting the temperature of a heater shaker to 37°C:
frompylabrobot.heating_shakingimportHeaterShaker, InhecoThermoShakeBackendbackend=InhecoThermoShakeBackend()
hs=HeaterShaker(backend=backend, name="HeaterShaker", size_x=0, size_y=0, size_z=0)
awaiths.setup()
awaiths.set_temperature(37)Fans (docs)
Running a fan at 100% intensity for one minute:
frompylabrobot.only_fansimportFanfrompylabrobot.only_fansimportHamiltonHepaFanBackendfan=Fan(backend=HamiltonHepaFanBackend(), name="my fan")
awaitfan.setup()
awaitfan.turn_on(intensity=100, duration=60)Thermocyclers (docs)
Running a thermocycler with a simple protocol:
awaittc.run_pcr_profile(
denaturation_temp=98.0,
denaturation_time=10.0,
annealing_temp=55.0,
annealing_time=30.0,
extension_temp=72.0,
extension_time=60.0,
num_cycles=2,
block_max_volume=25.0,
lid_temperature=105.0,
pre_denaturation_temp=95.0,
pre_denaturation_time=180.0,
final_extension_temp=72.0,
final_extension_time=300.0,
storage_temp=4.0,
storage_time=600.0,
)- discuss.pylabrobot.org for questions and discussions.
- GitHub Issues for bug reports and feature requests.
If you use PyLabRobot in your research, please cite the following:
@article{WIERENGA2023100111,
title = {PyLabRobot: An open-source, hardware-agnostic interface for liquid-handling robots and accessories},
journal = {Device},
volume = {1},
number = {4},
pages = {100111},
year = {2023},
issn = {2666-9986},
doi = {https://doi.org/10.1016/j.device.2023.100111},
url = {https://www.sciencedirect.com/science/article/pii/S2666998623001709},
author = {Rick P. Wierenga and Stefan M. Golas and Wilson Ho and Connor W. Coley and Kevin M. Esvelt},
keywords = {laboratory automation, open source, standardization, liquid-handling robots},
}Disclaimer: PyLabRobot is not officially endorsed or supported by any robot manufacturer. If you use a firmware driver such as the STAR driver provided here, you do so at your own risk. Usage of a firmware driver such as STAR may invalidate your warranty. Please contact us with any questions.
Developed for the Sculpting Evolution Group at the MIT Media Lab

