5

I'm having trouble fixing and understanding the problem here. I'm using an example to learn Asyncio but the code I'm using is similar to mine but mine gives an error message saying:

sys:1: RuntimeWarning: coroutine 'run_script' was never awaited

Please any help will be greatly appreciated. Below is my code

async def run_script(script):
    print("Run", script)
    await asyncio.sleep(1)
    os.system("python " + script)

and I'm running it like this

for script in os.listdir():
    if script.endswith(".py"):
        scripts.append(run_script(script))

loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(scripts))
loop.close()
2
  • 4
    You need to unpack scripts when passing it to gather: asyncio.gather(*scripts). Commented Feb 15, 2018 at 13:28
  • thanks @dirn. It works now Commented Feb 15, 2018 at 15:42

1 Answer 1

5

As @dim mentioned what's the typo in your code, you also need to be aware os.system is running in synchronous, which means scripts in your folder will be run in sequence instead of in asynchronous way.

To understand that, add file called hello_world.py:

import time
time.sleep(2)
print('hello world')

if you run you script as follows, it will cost you 2s + 2s = 4s:

loop = asyncio.get_event_loop()
loop.run_until_complete(
    asyncio.gather(
        *[run_script('hello_world.py') for _ in range(2)]
    )
)

So to solve this issue, you can use asyncio.subprocess module:

from asyncio import subprocess

async def run_script(script):
    process = await subprocess.create_subprocess_exec('python', script)
    try:
        out, err = await process.communicate()
    except Exception as err:
        print(err)

Then it will cost you only 2 sec, because it is running asynchronously.

Sign up to request clarification or add additional context in comments.

1 Comment

I would recomment subprocess.create_subprocess_exec('python', script). This will eliminate quoting issues in case the name of the script or the directory it's in contain whitespace.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.