如何获得`Process`的实例?

时间:2018-05-24 22:56:14

标签: python python-3.x asynchronous subprocess python-asyncio

  

问题:如何获取班级asyncio.subprocess.Process的实例?

为了替换对subprocess.Popen实例的方法的同步和阻塞调用,我想使用asyncio.subprocess.Process的实例。

asyncio asyncio.create_subprocess_exec声称这是由函数subprocess.Popen完成的,其参数与asyncio.create_subprocess_exec的构造函数的参数大致相同。特别是,文档声称subprocess.Popen将:

  

返回一个流程实例。

然而,根据我的经验,这是真的。与asyncio.subprocess.Process类的实例类似,根据其文档,pid类的实例应具有stderrcommunicate等属性以及import asyncio, subprocess loop = asyncio.get_event_loop() args = ['/bin/sh', '-cmd', "echo '$MONEY'"] async def test2(args): proc = await asyncio.create_subprocess_exec(args, stdin=asyncio.subprocess.PIPE, stdout=asyncio.subprocess.PIPE, stderr=subprocess.PIPE) return proc proc = test2(args) print(proc) type(proc) 等方法

这是一个完整的最小工作示例:

proc

这些都表明Process是一个协程。我想要一个<button>Delete this comment</button> 类的实例。

1 个答案:

答案 0 :(得分:1)

我只是想通了;我在这里发布我的MWE,以防将来帮助任何人,因为我花了几个小时才弄明白。 this tutorial中的MWE示例以及评论中的建议都很有帮助。

import asyncio, subprocess

loop = asyncio.get_event_loop()

args = '/bin/sh'

async def test2(args):
     proc = await asyncio.create_subprocess_exec(args, 
                                      stdin=asyncio.subprocess.PIPE,
                                      stdout=asyncio.subprocess.PIPE, 
                                      stderr=subprocess.PIPE)
     return proc

try:
    proc = loop.run_until_complete(test2(args))
finally:
    loop.close()
# Check that it worked
print(proc)
type(proc)