I made a script that analyse a poly line and measures the distances between each vertex and save them in a list.
Then, takes a copy of that polyline that i converted into a curve, add a Follow_Path constraint and put empties for each vertex of that poly line.

In my tests it seemed to work. I made a Curve with at least 5 vertices, converted into a poly line and after running the script, each path empty was pretty much at the position of the analysed poly line vertices.

The problem is, when i convert a poly loop to a poly line from a character mesh (eyes or mouth for example) the script works but the empties dont match up with the vertex postion of that poly line anymore. I wonder if this has something to do with the vertex order.

Here is the script, probably awkwardly done since i'm a bloody python rook, no doubt. So, in order for it to work you need a poly line (named U.Lip) and a copy converted into a Curve (named U.Lip.Crv).

This script is based on an idea by Marco Giordano for Maya and can be found on Vimeo and probably explains it better what i am trying to do here.

It would be awesome if somone could find the time to look into it and tell me why it wont work as expected.

import bpy

import os

bpy.context.scene.objects.active = bpy.data.objects['U.Lip']

def findlengthofcurve(obj):
    mesh = obj.data
    edges = mesh.edges.values()
    vertices = mesh.vertices.values()
    TotalSegLength = 0      #Total Length
    NumSeg = 0              #Total Number of Segments
    SegList =[]             #List of Segment Lengths
    for i in edges:
        print (vertices)
        vtx1, vtx2 = i.vertices
        segLength = (vertices[vtx1].co-vertices[vtx2].co).length
        TotalSegLength += segLength       
    return NumSeg,TotalSegLength,SegList    

list = findlengthofcurve(bpy.context.active_object)

print (list[2])         #List of Segment Lengths
print (list[1])         #Total Length
print (list[0])         #Total Number of Segments

# This part places an empty at the start of the path
bpy.context.scene.objects.active = bpy.data.objects['U.Lip.Crv']
name = 'Empty.00'
bpy.ops.object.empty_add(type='PLAIN_AXES', location=(0,0,0))
bpy.context.active_object.name = name
bpy.data.objects['Empty.00'].constraints["Follow Path"].target = bpy.data.objects["U.Lip.Crv"]
bpy.data.objects['Empty.00'].constraints["Follow Path"].use_fixed_location = True
bpy.data.objects['Empty.00'].constraints["Follow Path"].offset_factor = 0.0
bpy.context.active_object.empty_draw_size = bpy.context.active_object.empty_draw_size / 50

#This part goes through the List of Segment Length and calculates the empty positions for the path
for x in range(list[0]):
    name = 'Empty.0{0}'.format(x+1)
    bpy.ops.object.empty_add(type='PLAIN_AXES', location=(0,0,0))
    bpy.context.active_object.name = name
    bpy.context.active_object.empty_draw_size = bpy.context.active_object.empty_draw_size / 50
    bpy.data.objects[name].constraints["Follow Path"].target = bpy.data.objects["U.Lip.Crv"]
    bpy.data.objects[name].constraints["Follow Path"].use_fixed_location = True

    ppos = ((list[2][x]*100)/(list[1])/100) #calculates the percentage position for the path
    print (ppos)
    bpy.data.objects[name].constraints["Follow Path"].offset_factor = ppos
    bpy.data.objects[name].constraints["Follow Path"].use_curve_follow = False