В оболочке передать результаты "python -m SimpleSTTPServer" в канал - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь отправить результаты команды Python CLI "SimpleHTTPServer" в канал, чтобы получить результаты. Но похоже, что первая строка вывода не передается в канал, и я не могу понять, почему.

Вот типичный результат выполнения команды. В первой строке указывается, что он запустил сервер и порт, который он использует. Затем он сообщает о различных сетевых операциях по мере их возникновения. Так что, если я запускаю python -m SimpleHTTPRequest и затем загружаю страницу index.html дважды, вывод будет выглядеть так:

$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...
127.0.0.1 - - [07/May/2018 21:08:31] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [07/May/2018 21:08:36] "GET / HTTP/1.1" 200 -

Если я перенаправлю stderr на stdout, а затем отправлю в канал, я ожидаю, что все линии придут в stdin после канала. Но этого, похоже, не происходит. Когда я использую sed после канала и у него есть префикс всех строк с «This is stdin:», первая строка вывода не появляется.

$ python -m SimpleHTTPServer 2>&1 | sed "s/.*/This is stdin\:&/"
This is stdin:127.0.0.1 - - [07/May/2018 23:35:07] "GET / HTTP/1.1" 200 -
This is stdin:127.0.0.1 - - [07/May/2018 23:35:11] "GET / HTTP/1.1" 200 -

Я пробовал разные варианты перенаправления. Я могу перенаправить с stdout на stderr, используя 1>&2, и все три строки отображаются без перехода в канал, как и ожидалось Я попытался перенаправить с stdin на stdout с 0>$1, основываясь на обсуждении в этого ответа , но это не отправило ни одной строки в канал. Я попытался поместить команду python в фигурные скобки, основываясь на этом ответе , но результат не изменился. Ясно, что журналы сетевой активности отправляются на stderr, но неясно, куда идет первая строка. Я также пытался с grep после трубы, с тем же результатом. Во всех случаях первая строка вывода не поступает в stdin после канала.

Похоже, что первая строка вывода python "SimpleHTTPServer" не собирается в stdout или stderr, поэтому я не могу передать его в канал. Что происходит?


В случае, если у кого-то есть способ лучше, вот что я пытаюсь сделать. Мне нужна однострочная команда оболочки, которая (1) запустит локальный сервер, используя python SimpleHTTPServer; (2) выяснить, какой номер порта он использует; затем (3) откройте браузер на этом порту локального сервера. Я знаю, что порт SimpleHTTPServer по умолчанию - 8000; но если он уже используется, он назначит другой, поэтому мне нужно это знать. Я также знаю, что могу сказать SimpleHTTPServer, какой порт использовать, но если этот порт уже используется, команда не выполнится. Я знаю, что в Python вы можете спросить, какой порт используется, но мне нужен сценарий оболочки для запуска из другого приложения. Итак, я остановился на выводе команды при запуске сервера, регулярном выражении 4-значного номера порта, присвоении ему переменной, а затем использовании этой переменной для открытия нужного порта в браузере. Я ожидаю, что следующее сработает, но это не так.

$ port=$(python -m SimpleHTTPServer 2>&1 | grep -o '[0-9]\{4\}') ; open http://localhost:$port
...