我想在python中同时运行多个命令,但是该程序似乎在上一个命令完成时执行了一个命令,
这是我的代码:
import os
import glob
for i in (glob.glob("PATH/SUB/*.csv")):
file = i.split('\\')[1]
os.system("scrapy crawl quotes -a file=%s -o /OUTPUT/%s.csv &" % (file,file))
答案 0 :(得分:1)
#!/usr/bin/env python3.6
import time
import asyncio
from asyncio.subprocess import PIPE, STDOUT
async def run(shell_command):
p = await asyncio.create_subprocess_shell(shell_command, stdin=PIPE, stdout=PIPE, stderr=STDOUT)
return (await p.communicate())[0].splitlines()
async def main():
commands = [run('sleep 5; echo {i}'.format(i=i)) for i in range(5)]
for f in asyncio.as_completed(commands):
print(await f)
start = time.time()
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
total = time.time() - start
print("Total time {} s".format(total))
您可以检查asyncio子进程。
让我们测试一下。我们将尝试运行5次“ sleep 5”命令-我们希望总运行时间类似于5秒(而不是25秒)。
[b'2']
[b'3']
[b'4']
[b'1']
[b'0']
Total time 5.0065038204193115 s
输出:
#!/usr/bin/env python3.6
import glob
import asyncio
async def run(shell_command):
p = await asyncio.create_subprocess_shell(shell_command)
await p.communicate()
async def main(shell_commands):
for f in asyncio.as_completed([run(c) for c in shell_commands]):
await f
commands = []
for i in (glob.glob("PATH/SUB/*.csv")):
file = i.split('\\')[1]
commands.append("scrapy crawl quotes -a file=%s -o /OUTPUT/%s.csv &" % (file, file))
loop = asyncio.get_event_loop()
loop.run_until_complete(main(commands))
loop.close()
一切正常。
在适应您的需求之后:
loop = asyncio.get_event_loop()
最后,如果您使用的是Windows,则需要进行更改
loop = asyncio.ProactorEventLoop()
进入
file = i.split('\\')[1].
我认为您使用Windows是因为您的代码
{{1}}