Why would adding a parent with Python make the child unmovable? update:

As it turns out, it was because I scaled the child object to z = 0 - c.scale(1,1,0) - scaling to non-zero works just fine



I have a child called c and a parent called p.

I use Python to create a parent-child relation.

Either:

p.select = True
c.select = True
bpy.context.scene.objects.active = p
bpy.ops.object.parent_set(type="OBJECT")
p.select = False  
c.select = False
bpy.ops.object.select_all(action='DESELECT')


or simply:

c.parent = p


The parent-child relationship is established, which I can confirm in the Outliner.

If I move p in the 3D View the child c will also move, however I cannot move c - it seems locked to it's position, however when I check the locks in the Properties Editor no locks are active. I can alter the location using the transform properties in the Properties Editor, but I can't move it using the mouse. I can scale and rotate as normal though.

Both p (an empty) and c (a text) is created in Python.

If I do the same manually - create the objects and set their parent relationship, I can move the child in the UI. This is the type of relationship I dream of (one where I can move :P ).

How can I add a parent relationship from Python that lets me move both the parent (with the child following) and the child (on its own) from the UI? 

Further observations: The problem seems to be in the object creation process. No matter how I parent objects that are Python-created, I end up with not being able to move the child on it's own. I even tried to use the exact same code line that the UI uses to generate the object.
This works fine: 

import bpy

C = bpy.context
bpy.ops.object.text_add(location=(0, 0, 0))
a = C.object 
bpy.ops.object.empty_add(type='PLAIN_AXES', location=(0, 0, 1))
b = C.object
a.parent = b
a.matrix_parent_inverse = b.matrix_world.inverted()


As you can see:



There must be something wrong with the code you use for creating the objects.
You should try removing the parenting part of your code and see if the code around it works fine.