PyUltraLight: A Pseudo-Spectral Solver for Ultralight Dark Matter Dynamics. 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 Schrodinger-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.