Я работаю над созданием инструмента, который позволит пользователям запускать jupyter-notebook w / pyspark на сервере AWS и перенаправлять порт на локальный хост для подключения к ноутбуку.
Я былс помощью subprocess.Popen для запуска ssh на удаленном сервере и запуска оболочки / ноутбука pyspark, но я не могу избежать, чтобы он выводил все на терминал.Я хочу выполнить действие для каждой строки, чтобы получить номер порта.
Например, при запуске этого (следуя наиболее популярному ответу здесь: Чтение потокового ввода от 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, которая мешает этому действовать аналогичным образом?