How to UV Unwrap and Scale UVs with Python (while in object mode)?
Look for python code in bl_operators

Some default blender operators have their python code available in 2.79/scripts/startup/bl_operators in this case uvcalc_smart_project.py .A quick peruse of the code and you will see that most of it can be done in object mode, by passing operator properties to the main(...) method. . Except "aspect correction"

print("Smart Projection time: %.2f" % (time.time() - time1))
# Window.DrawProgressBar(0.9, "Smart Projections done, time: %.2f sec" % (time.time() - time1))

# aspect correction is only done in edit mode - and only smart unwrap supports currently


Quick test in console, in object mode (defaut scene camera view) (Please also note that even though blender uses radians as its rotation unitprojection_limit appears to use degrees going from 1 to 89. So pass it  30 rather than radians(30)

&gt;&gt;&gt; from bl_operators.uvcalc_smart_project import main
&gt;&gt;&gt; main(
main(context, island_margin, projection_limit, user_area_weight, use_aspect, stretch_to_bounds, )
&gt;&gt;&gt; main(C, .02, 30, 0.03, True, True) # not radians?
Smart Projection time: 0.10


producing 



Scaling UV is pretty trivial see python templates &gt; Operator UV simple  Script below doubles the size of object mode context object UV.

import bpy
import bmesh


def main(context):
    obj = context.active_object
    me = obj.data
    bm = bmesh.new()
    bm = bmesh.from_mesh(me)

    uv_layer = bm.loops.layers.uv.verify()
    bm.faces.layers.tex.verify()  # currently blender needs both layers.

    # scale UVs x2
    for f in bm.faces:
        for l in f.loops:
            l[uv_layer].uv *= 2

    bm.to_mesh(me)


Note: 

bm.faces.layers.tex.verify()


is no longer supported in 2.80 and will need to be removed.