【发布时间】: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