【发布时间】:2018-01-27 22:15:31
【问题描述】:
我有一个异步运行子进程命令并返回结果的函数。它看起来像这样:
import asyncio
async def async_subprocess_command(*args):
# Create subprocess
process = await asyncio.create_subprocess_exec(
*args,
# stdout and stderr must a pipe to be accessible as process.stdout
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE)
# Wait for the subprocess to finish
stdout, stderr = await process.communicate()
#Remove final carriage return from string
stdout_formatted = stdout.decode().strip().replace('\r', '')
stderr_formatted = stderr.decode().strip().replace('\r', '')
# Return stdout and sterr
return stdout_formatted, stderr_formatted
如果我能负担得起同步工作,我倾向于使用对子流程模块的调用:
import subprocess
subprocess.getoutput([parameter1,parameter2,parameter3])
当我同步调用subprocess.getoutput 时(假设我正在调用外部工具),没有打开任何控制台窗口。当我异步调用asyncio.create_subprocess_exec 时(再次,假设我正在调用一个外部工具),每次调用都会弹出一个控制台窗口短暂的时间,这使得计算机难以交互,直到异步调用完成。
有没有办法在不弹出控制台窗口的情况下异步调用asyncio.create_subprocess_exec?
【问题讨论】:
-
使用进程creation flag。您可以通过
creationflags=DETACHED_PROCESS完全阻止分配控制台。或者,通过creationflags=CREATE_NO_WINDOW分配一个不创建窗口的控制台。不创建窗口的选项可能看起来毫无意义,但它提高了与某些控制台应用程序的兼容性,因为该进程仍然附加到控制台,而且这个无窗口控制台将被子进程继承。相反,当使用分离的进程时,子进程将分配一个新的控制台。 -
感谢您提供此信息 - 我能够使用此功能调整原始功能,甚至使其更快。
标签: windows python-3.x subprocess python-asyncio windows-console