我正在创建一个工具,允许用户在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版本在本质上有什么不同之处,可防止其行为类似?
答案 0 :(得分:0)
事实证明,该问题与jupyter产生的控制台输出实际上将输出到STDERR而不是stdout有关。我不知道为什么。但是无论如何,此更改完全解决了问题:
{{1}}