【问题标题】:capture jupyter-notebook stdout with subprocess使用子进程捕获 jupyter-notebook 标准输出
【发布时间】:2019-10-01 22:49:26
【问题描述】:

我正在创建一个工具,允许用户在 AWS 服务器上运行带有 pyspark 的 jupyter-notebook,并将端口转发到他们的 localhost 以连接到笔记本。

我一直在使用 subprocess.Popen ssh 进入远程服务器并启动 pyspark shell/notebook,但我无法避免让它将所有内容打印到终端。我想每行执行一个操作来检索端口号。

例如,运行这个(按照这里最流行的答案:Read streaming input from subprocess.communicate()

command = "jupyter-notebook"
con = subprocess.Popen(['ssh', node, command], stdout=subprocess.PIPE, bufsize=1)

with con.stdout:
    for line in iter(con.stdout.readline, b''):
        print(line),
con.wait()

这会忽略上下文管理器,con 部分开始打印标准输出,以便立即打印到终端

[I 16:13:20.783 NotebookApp] [nb_conda_kernels] enabled, 0 kernels found
[I 16:13:21.031 NotebookApp] JupyterLab extension loaded from /home/*****/miniconda3/envs/aws/lib/python3.7/site-packages/jupyterlab
[I 16:13:21.031 NotebookApp] JupyterLab application directory is /data/data0/home/*****/miniconda3/envs/aws/share/jupyter/lab
[I 16:13:21.035 NotebookApp] [nb_conda] enabled
...
...
...

当我调用如下所示的随机脚本而不是“jupyter-notebook”(command="bash random_script.sh")时,我可以让上下文管理器运行

# random_script.sh
for i in $(seq 1 100)
do
    echo "some output: $i"
    sleep 2
done

这符合预期,我实际上可以在with 语句中的每行执行一个操作。 jupyter 版本是否有一些根本不同的东西可以防止它发生类似的行为?

【问题讨论】:

    标签: python-2.7 ssh subprocess jupyter-notebook


    【解决方案1】:

    事实证明,这个问题与 jupyter 生成的控制台输出实际上是转到 STDERR 而不是 stdout 的事实有关。我不确定为什么。但无论如何,这个改变完全解决了这个问题:

    con = subprocess.Popen(['ssh', node, command], 
                           stdout=subprocess.PIPE, 
                           stderr=subprocess.STDOUT,  # <-- redirect stderr to stdout
                           bufsize=1)
    

    【讨论】:

      猜你喜欢
      • 2016-12-01
      • 2013-01-22
      • 2020-10-18
      • 1970-01-01
      • 2010-10-29
      • 1970-01-01
      • 1970-01-01
      • 2010-12-09
      • 1970-01-01
      相关资源
      最近更新 更多