Actually, this is straightforward and those who works with asyncio library use all the time.

It is asyncio.get_event_look().run_until_complete(...)

Now, I will just wrap it into a nicer package, like this:

def force_sync(fn):
'''
turn an async function to sync function
'''
import asyncio

@functools.wraps(fn)
def wrapper(*args, **kwargs):
res = fn(*args, **kwargs)
if asyncio.iscoroutine(res):
return asyncio.get_event_loop().run_until_complete(res)
return res

return wrapper


Here is how to use it:

@force_sync
async def run():
... do some async works ...

results = run()


For those who look for the vice versa, turning a sync to async, I have wrote it here