How to rotate an object from a reference plane
import bpy
from mathutils import Matrix, Vector

def scale_from_vector(v):
    mat = Matrix.Identity(4)
    for i in range(3):
        mat[i][i] = v[i]
    return mat    

o1 = bpy.data.objects['Object.001']
o2 = bpy.data.objects['Object.002']

loc_src, rot_src, scale_src = o1.matrix_world.decompose()
loc_dst, rot_dst, scale_dst = o2.matrix_world.decompose()


Apply the rotation of object o1 to object o2

o2.matrix_world = (
    Matrix.Translation(loc_dst) * 
    rot_src.to_matrix().to_4x4() * 
    scale_from_vector(scale_dst)
)


If you only want to align an axis use the following code instead: 

#only align z-axis
axis = Vector((0.0, 0.0, 1.0))
z1 = rot_src * axis
z2 = rot_dst * axis
q = z2.rotation_difference(z1)

o2.matrix_world = (
    Matrix.Translation(loc_dst) *
    (q*rot_dst).to_matrix().to_4x4() *
    scale_from_vector(scale_dst)
)