每次调用都会打开asyncio.create_subprocess_exec控制台窗口

时间:2017-08-19 09:37:03

标签: windows python-3.x subprocess python-asyncio windows-console

我有一个异步运行子进程命令并返回结果的函数。它看起来像这样:

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

2 个答案:

答案 0 :(得分:1)

使用eryksun的建议,我能够使用带有额外参数的原始函数(creationflags = DETACHED_PROCESS)。它比在第一个答案中使用asyncio.create_subprocess_shell函数稍快,并按预期工作。有关其他好处的更多信息,请参阅上面的eryksun评论。

async def async_subprocess_command(*args):

    #CREATE_NO_WINDOW = 0x08000000 using detatched_process is slightly faster
    DETACHED_PROCESS = 0x00000008
    # 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,
        creationflags=DETACHED_PROCESS,
        )
    # 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

答案 1 :(得分:0)

我在另一个功能中找到了答案:

async def async_subprocess_command(cmd):
        '''
        cmd should be a string exactly as you 
        write into the cmd line
        '''
        process = await asyncio.create_subprocess_shell(cmd, 
                stdin=None, stderr=asyncio.subprocess.PIPE, 
                stdout=asyncio.subprocess.PIPE)

        stdout, stderr = await process.communicate()

        stdout_formatted = stdout.decode().strip().replace('\r', '')
        stderr_formatted = stderr.decode().strip().replace('\r', '')

        return stdout_formatted, stderr_formatted