PYULTRALIGHT simulates the dynamics of ultralight dark matter in a non-expanding background. PYULTRALIGHT can describe the evolution of several interacting ultralight dark matter halos or one or more halos orbiting a central, fixed Newtonian potential, the latter scenario corresponding to dwarf galaxies orbiting a massive central galaxy. We verify PYULTRALIGHT by showing that it reproduces qualitative dynamical features of previously published simulations and demonstrate that it has excellent energy-conservation properties. PYULTRALIGHT is implemented in a Python-based Jupyter notebook, solving the Schrödinger-Poisson equation governing ultralight scalar field dark matter dynamics in the non-relativistic regime using a symmetrised split-step pseudospectral algorithm. The notebook interface makes it simple to specify simulation parameters and visualise the resulting output but performance-critical routines are managed via calls to computationally efficient compiled libraries. PYULTRALIGHT runs on standard desktop hardware with support for shared memory mutlithreading and is available on GitHub.