How to tell which objects are using a Bezier Circle as bevel object? I have a large animation (over 200 objects) that I have been working on for a while. In the animation I use a great number of tubes, made simply by defining Bezier Circles as bevel objects for Bezier Curves.

Some of the Curves share Circles as bevel objects, and I'm now starting to realise that this is a problem, since I would very much like to parent each Circle to its belonging Curve and hide it, for the sake of order.

Rather than having to manually inspect every Curve and take note of which Circle it uses, I would like to do the reverse operation, i.e. go through every Circle and take note of which Curves that uses it as bevel object. This is nice because it would allow me to duplicate Circles used multiple times and parent each new version to a Curve. Can this be done? If not in the GUI, then possibly programmatically?

TL:DR
I want to go through each Bezier Circle and see which objects that uses it as bevel object, so that I can duplicate a Circle if it is used by multiple objects, and parent each new Circle to its belonging object, such that no two objects share the same Circle as bevel object.
I think something like this might work, but for your own sanity run this only a copy of your scene, or a small representative version of your scene. 

Just in case: 


This finds the bevel_object
if the bevel Object is used by another BezierCurve it duplicates the bevel Object and associated Curve data, 
then uses the duplicate as the replacement bevel Object. 


In code form:

import bpy

scene = bpy.context.scene

bevel_names = set()
for obj in bpy.data.objects:

    if obj.type == 'CURVE':
        name = obj.name
        b_obj = obj.data.bevel_object
        print(' {0} -&gt; {1} '.format(name, str(b_obj)))

        if b_obj:
            if b_obj.name in bevel_names:
                dup = b_obj.copy()
                dup.data = b_obj.data.copy()
                scene.objects.link(dup)
                obj.data.bevel_object = dup
                bevel_names.add(dup.name)
                # dup.parent = obj
            else:
                bevel_names.add(b_obj.name)
                #_obj.parent = obj


For the bezierCurves, it doesn't appear possible to parent the bevel object to them. A solution would be to make an empty for every BezierCurve and parent both BezierCurve and bevel Object to the empty.