If you're only going to call this operator from the callback, you don't really need to use an operator.
However, the reason that your operator fails is that it doesn't support execution rather than invocation.
Add a method called "execute" with (self, context) as the arguments. If you want to use the invoke() method's code, just call self.invoke and pass None for the event (be careful with this). The execute method should return a set for the result just as invoke does, so if you're using invoke's body, just return the result of self.invoke(context, None).
Finally, call the operator as "EXEC_DEFAULT" instead of "INVOKE_DEFAULT"
import bpy
class FooOp(bpy.types.Operator):
bl_idname = "development.fooop"
bl_label = "Foo"
@classmethod
def poll(cls,context):
return True
def execute(self, context):
return self.invoke(context, None)
def invoke(self,context,event):
self.report({'INFO'},"running FooOp!")
return {'FINISHED'}
def make_foo(scene):
bpy.ops.development.fooOp('EXEC_DEFAULT')
bpy.app.handlers.render_complete.append(make_foo)
bpy.utils.register_class(FooOp)