import maya.cmds as cmds
#先选择曲面执行一次下面代码(设置曲面uv值)
mesh = cmds.ls(sl = True)
mesh_u = 2;
mesh_v = 14;
#再选择骨骼执行以下代码
jnt = cmds.ls(sl = True)
mesh_shape = cmds.listRelatives(mesh,shapes = 1)
fol_grp = cmds.createNode('transform',n = 'follic_grp')
loc_grp = cmds.createNode('transform',n = 'locator_grp')
Locator = []
for i in jnt:
    Loca = cmds.spaceLocator()
    Loca_shape = cmds.listRelatives(Loca,shapes = 1)
    cmds.matchTransform(Loca,i)
    foli = cmds.createNode('follicle')
    foli_trans = cmds.listRelatives(foli,ap = 1)
    cmds.connectAttr(foli + '.outRotate',foli_trans[0] + '.rotate')
    cmds.connectAttr(foli + '.outTranslate',foli_trans[0] + '.translate')
    cmds.connectAttr(mesh_shape[0] + '.worldMatrix[0]',foli + '.inputWorldMatrix')
    cmds.connectAttr(mesh_shape[0] + '.local',foli + '.inputSurface')
    cpon = cmds.createNode('closestPointOnSurface')
    cmds.connectAttr(Loca_shape[0] + '.worldPosition[0]',cpon + '.inPosition')
    cmds.connectAttr(mesh_shape[0] + '.worldSpace[0]',cpon + '.inputSurface')
    mult_V = cmds.createNode('multiplyDivide')
    mult_U = cmds.createNode('multiplyDivide')
    cmds.setAttr(mult_V + '.input2X',mesh_v)
    cmds.setAttr(mult_V + '.operation',2)
    cmds.setAttr(mult_U + '.input2X',mesh_u)
    cmds.setAttr(mult_U + '.operation',2)
    cmds.connectAttr(cpon + '.parameterU',mult_U + '.input1X')
    cmds.connectAttr(cpon + '.parameterV',mult_V + '.input1X')
    cmds.connectAttr(mult_U + '.outputX',foli + '.parameterU')
    cmds.connectAttr(mult_V + '.outputX',foli + '.parameterV')
    cmds.parent(Loca,loc_grp)
    cmds.parent(foli,fol_grp)
创建好之后可以根据控制定位器位置调整毛囊位置
如果不需要调整毛囊位置的话可以在for循环里面加
cmds.disconnectAttr(mult_U + '.outputX',foli + '.parameterU')
    cmds.disconnectAttr(mult_V + '.outputX',foli + '.parameterV')
    cmds.delete(mult_V)
    cmds.delete(mult_V)
    cmds.delete(loc_grp)