python duplicate_move and snap_selected_to_cursor fails; context is incorrect
Figured it out - I needed to add
bpy.context.area.type = 'VIEW_3D'
to switch from the text editor to the 3dview, before snap_selected_to_cursor.