【问题标题】:Why is the output of my subprocess not being printed?为什么我的子进程的输出没有被打印出来?
【发布时间】:2016-05-08 15:48:41
【问题描述】:

这是我从子进程异步读取标准输入/标准输出并从 Python 打印的最佳尝试:

import asyncio
import subprocess

from asyncio.subprocess import STDOUT, PIPE, DEVNULL


async def start_stream():
    return await asyncio.create_subprocess_shell(
        'watch ls /proc',
        stdout=PIPE,
        stderr=PIPE,
        limit=1024
    )


async def spawn():
    ev_proc = await start_stream()
    while True:
        stdout, stderr = await ev_proc.communicate()
        print(stdout, stderr)


if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(spawn())

为什么打印功能没有输出?

【问题讨论】:

    标签: python python-asyncio


    【解决方案1】:

    您的watch 进程永远不会终止,而communicate() 会等待该进程终止,因此stdout 永远不会到达您的脚本中。
    https://docs.python.org/3/library/asyncio-subprocess.html

    协程通信(输入=无)

    与进程交互:发送数据到 标准输入。从 stdout 和 stderr 读取数据,直到到达文件结尾。 等待进程终止。

    尝试以下受https://stackoverflow.com/a/24435988/2776376 启发的代码。 它使用pipe_data_received 然后len > 16 只是为了防止打印空行。

    SubprocessProtocol.pipe_data_received(fd, data)

    当子进程将数据写入其 stdout 或 stderr 管道时调用。 fd 是管道的整数文件描述符。 data 是一个包含数据的非空字节对象。

    import asyncio
    
    class SubprocessProtocol(asyncio.SubprocessProtocol):
        def pipe_data_received(self, fd, data):
            if fd == 1:
                text = data.decode()
                if len(text.strip()) > 16:
                    print(text.strip())
    
        def process_exited(self):
            loop.stop()
    
    loop = asyncio.get_event_loop()
    
    
    ls = loop.run_until_complete(loop.subprocess_exec(
        SubprocessProtocol, 'watch', 'ls', '/proc'))
    loop.run_forever()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-18
      • 2021-12-24
      • 2021-12-31
      • 1970-01-01
      • 2021-01-17
      • 1970-01-01
      • 1970-01-01
      • 2023-01-13
      相关资源
      最近更新 更多