使用子流程

时间:2019-05-14 20:48:46

标签: python-2.7 ssh subprocess jupyter-notebook

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

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

例如,运行此命令(遵循此处最受欢迎的答案: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部分开始从stdout打印,以便立即将其打印到终端

[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版本在本质上有什么不同之处,可防止其行为类似?

1 个答案:

答案 0 :(得分:0)

事实证明,该问题与jupyter产生的控制台输出实际上将输出到STDERR而不是stdout有关。我不知道为什么。但是无论如何,此更改完全解决了问题:

{{1}}