Bmesh: how can I import custom vertex normals
I believe since Blender 2.74, this was made possible for the bpy Mesh type. You can use the mesh normals_split_custom_set method to do this.

In this example, I only have per-vertex normals so I create a new list with one normal corresponding to each loop.

normals2 = []
for l in mesh.loops:
    normals2.append(normals[l.vertex_index])
mesh.normals_split_custom_set(normals2)
mesh.use_auto_smooth = True


Note that auto smooth needs to be enabled for this to work.

In my case, I could have used the normals_split_custom_set_from_vertices method, and passed in normals directly.