Install & Compatibility
Where this runs
tested against v1.11.2 · pip install
no network on importno background threads
Install × environment matrix
Each cell = how many times install + import succeeded across repeated harness runs. Partial = flaky.
glibc = Debian/Ubuntu slim · musl = Alpine Linux
muslpy 3.10–3.95 runs
installs and imports cleanly · install 0.0s · import 2.448s · 110.9MB
glibcpy 3.10–3.95 runs
installs and imports cleanly · install 5.6s · import 2.252s · 107MB
113MB installed
● package 113MB
Code
Verified usage
Verified import paths — ran on the pinned version, not inferred.
EpicsSignal
✓ from ophyd import EpicsSignal
Simple EPICS PV signal
EpicsMotor
✓ from ophyd import EpicsMotor
EPICS motor record device
Device
✓ from ophyd import Device
Base class for composite devices
Signal
✓ from ophyd import Signal
Base signal class for internal or simulated signals
Component
✓ from ophyd import Component
✗ from ophyd.device import Component
Component is re-exported at top-level; importing from ophyd.device is deprecated.
DynamicDeviceComponent
✓ from ophyd import DynamicDeviceComponent
✗ from ophyd.device import DynamicDeviceComponent
Same as Component; prefer top-level import.
Basic usage: create an EPICS signal and motor, define a composite device with Components, and wait for connections.
from ophyd import EpicsSignal, EpicsMotor
from ophyd import Component, Device
# Create a simple EPICS signal
sig = EpicsSignal('MYPV:PREFIX', name='my_signal')
sig.wait_for_connection()
print(sig.get())
# Create a motor
motor = EpicsMotor('MYMOTOR:PREFIX', name='my_motor')
motor.wait_for_connection()
print(motor.user_readback.get())
# Define a composite device
class MyDevice(Device):
x = Component(EpicsMotor, 'X')
y = Component(EpicsMotor, 'Y')
detector = Component(EpicsSignal, 'Det')
dev = MyDevice('MYDEV:', name='my_device')
dev.wait_for_connection()
print(dev.detector.get())
Debug
Known issues
breakingInophyd v1.10.0, the EPICS backend API changed. Fallback backends are now class-based instead of function-based. Code using custom backends may need updates.fixReview migration notes at https://blueskyproject.io/ophyd/upcoming-changes.html
affects: >=1.10.0
deprecatedThe function 'set_and_wait' is deprecated since v1.7.0 and may be removed in future releases.fixUse Signal.set() with await or status events instead.
affects: >=1.7.0
gotchaEpicsSignal and EpicsMotor require a connection to the EPICS PV. If the PV does not exist, connecting will block until timeout (default 2.0 seconds in v1.10.5+).fixSet 'wait_for_connection=False' and check connection status manually, or increase timeout via timeout kwarg.
affects: all
gotchaDeviceStatus reports a fraction of 1.0 once complete as of v1.7.0. Code relying on a fraction of 0.0 after completion will break.fixAdjust code to handle updated fraction value.
affects: >=1.7.0, <1.7.0? earlier versions had 0.0? Actually v1.7.0 changed to 1.0.
breakingIn v1.8.0, isort was adopted; imports may need reorganization. Also, setuptools-scm replaced manual versioning.fixNo direct breakage, but import ordering may require changes if using strict flake8 or isort checks.
affects: >=1.8.0
deprecatedThe 'user_v2' module is removed as of v1.10.0. Use the standard 'ophyd' API instead.fixReplace 'from ophyd import user_v2' with direct imports from ophyd.
affects: >=1.10.0
Errors
Common errors & fixes
ModuleNotFoundError: No module named 'epics'
Missing PyEpics package for EPICS communication.
fixpip install pyepics or conda install -c conda-forge pyepics
TimeoutError: Connection to PV '...' timed out after 2.00 seconds
EPICS PV not available or network issue.
fixVerify PV exists and network is reachable. Increase timeout via 'timeout' parameter in EpicsSignal(..., timeout=10).
ImportError: cannot import name 'Component' from 'ophyd.device'
Direct import from internal module instead of top-level.
fixUse 'from ophyd import Component'
AttributeError: 'EpicsSignal' object has no attribute 'set_and_wait'
Deprecated function removed or renamed.
fixReplace with 'signal.set(value)' and use status objects or await.
Upgrade
Version history
1.11.2latest on PyPI · released Jun 4, 2026
Audit
Dependencies
epics-baseoptionalEPICS channel access for PyEpics backend
pyepicsoptionalRequired for EPICS PV communication unless using caproto or simulated signals
caprotooptionalAlternative EPICS CA backend
numpyrequiredArray support for signals