首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取输出不断变化的子流程的输出

获取输出不断变化的子流程的输出
EN

Stack Overflow用户
提问于 2020-06-10 03:20:46
回答 2查看 54关注 0票数 0

我想要捕获archlinux的pacman包管理器的输出。在这样做的时候,我想要处理它的输出,但也想把它显示给用户。

到目前为止,我带来了以下内容:

代码语言:javascript
复制
import subprocess as sb
import sys

lol = sb.Popen('sudo pacman -Syy',stdout=sb.PIPE,shell=True)

while True:
    l = lol.stdout.readline().strip()

    if not l and lol.poll() is not None:
        break

    sys.stdout.write(l.decode())
    sys.stdout.flush()

但它会打印以下内容:-

代码语言:javascript
复制
❯ python test.py
:: Synchronizing package databases...downloading core.db...downloading extra.db...downloading community.db...downloading multilib.db...done

这就是我想要的

代码语言:javascript
复制
:: Synchronizing package databases...
 core                                                                     135.2 KiB   160 KiB/s 00:01 [############################################################] 100%
 extra                                                                   1706.7 KiB   470 KiB/s 00:04 [############################################################] 100%
 community                                                                  4.9 MiB  1107 KiB/s 00:05 [############################################################] 100%
 multilib                                                                 161.2 KiB  3.09 MiB/s 00:00 [############################################################] 100%

done
EN

回答 2

Stack Overflow用户

发布于 2020-06-10 03:29:42

这就是你要找的吗?

代码语言:javascript
复制
import subprocess as sb
import sys

lol = sb.Popen('sudo pacman -Syy',stdout=sb.PIPE,shell=True)

while True:
    l = lol.stdout.readline().strip()
    if lol.poll() is not None:
        break

    sys.stdout.write(l.decode())
    sys.stdout.flush()

print("done")

输出:

代码语言:javascript
复制
:: Synchronizing package databases...downloading core.db...downloading extra.db...downloading community.db...done
票数 0
EN

Stack Overflow用户

发布于 2020-06-10 03:30:58

像这样的东西可能会对你有用:

代码语言:javascript
复制
import subprocess
import sys

# for py3 uncomment next line
# basestring = str


def cmd2args(cmd):
    """On linux we might need to split the command before executing...?
    """
    win32 = sys.platform == 'win32'
    if isinstance(cmd, basestring):
        if not win32 and cmd.startswith('cd '):
            return cmd
        else:
            return cmd if win32 else shlex.split(cmd)
    return cmd



def echorun(cmd, curdir='.'):
    """Send stderr to terminal, but yield stdout one line at a time.
    """
    popen = subprocess.Popen(cmd2args(cmd),
                             stdout=subprocess.PIPE,
                             stderr=subprocess.STDOUT,
                             cwd=curdir,
                             shell=sys.platform == 'win32',
                             universal_newlines=True)
    if popen.stdout is not None:
        for line in iter(popen.stdout.readline, ""):
            if sys.version_info.major == 3 and isinstance(line, str):
                yield  line
            else:
                yield line.decode()

    exitcode = popen.wait()
    if exitcode != 0:
        raise RuntimeError("Exitcode: %d" % exitcode)

用法为:

代码语言:javascript
复制
    for line in echorun('sudo pacman -Syy', curdir):
        print(line)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62290303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档