захватить стандартный вывод Jupyter-ноутбука с подпроцессом - PullRequest
0 голосов
/ 14 мая 2019

Я работаю над созданием инструмента, который позволит пользователям запускать 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, которая мешает этому действовать аналогичным образом?

1 Ответ

0 голосов
/ 15 мая 2019

Проблема оказалась связана с тем фактом, что вывод консоли, производимый jupyter, фактически шел в STDERR вместо stdout. Я не уверен почему. Но независимо от этого, это изменение полностью устранило проблему:

con = subprocess.Popen(['ssh', node, command], 
                       stdout=subprocess.PIPE, 
                       stderr=subprocess.STDOUT,  # <-- redirect stderr to stdout
                       bufsize=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...