簡體   English   中英

在 jupyter notebook 中打印子進程的實時輸出

[英]Print realtime output of subprocess in jupyter notebook

在我的文件 'wrapper.py' 中,我調用一個子進程並將其輸出實時打印到標准輸出。 如果我從控制台調用 python 腳本,這很好用。 但是,當從 jupyter notebook 調用它時,代碼會掛在 proc.stdout.readline() 行上。 以前的所有打印語句都可以正常工作..

proc = subprocess.Popen(["calc", "input.txt"], cwd=__dir, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
while True:
    out = proc.stdout.readline().decode("utf-8")
    err = proc.stderr.readline().decode("utf-8")
    if out == '' and err == '' and proc.poll() is not None:
        break
    if out:
        print("::::%s"%(out), end='')
    if err:
        print("::::%s"%(err), end='', file=sys.stderr)
rc = proc.poll()
print("---> returns %s"%(rc))

有沒有人知道如何解決這個問題?

我使用這個自定義函數在 Notebooks 中執行命令。

import subprocess

def run_cmd(cmd: str, stderr=subprocess.STDOUT) -> None:
    """Run a command in terminal

    Args:
        cmd (str): command to run in terminal
        stderr (subprocess, optional): Where the error has to go. Defaults to subprocess.STDOUT.

    Raises:
        e: Excetion of the CalledProcessError
    """
    out = None
    try:
        out = subprocess.check_output(
            [cmd],
            shell=True,
            stderr=stderr,
            universal_newlines=True,
        )
    except subprocess.CalledProcessError as e:
        print(f'ERROR {e.returncode}: {cmd}\n\t{e.output}',
              flush=True, file=sys.stderr)
        raise e
    print(out)

用例:

run_cmd("pip install emoji")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM