Получить порт из приложения на локальном хосте flask, запущенного в подпроцессном процессе Popen - PullRequest
0 голосов
/ 01 февраля 2019

Я использую флеш-сервер на локальном хосте из подпроцесса. Открытый процесс.

Я хочу знать, какой порт был выделен флеш-серверу в этом процессе, не блокируя вызывающий процесс.Затем я использовал бы порт localhost: для связи с приложением фляги.

Это server.py:

# server.py

import Flask


app = Flask(__name__)


@app.route('/')
def call_method():
    return 'Hello'


if __name__ == '__main__':
    app.run()

Вариант 1: выводит порт на стандартный вывод, но я не могу добраться до негопрограммно.Кроме того, блокирует вызывающий процесс

process = subprocess.Popen(['python', 'server.py'])

Вариант 2: перехватывает стандартный вывод, но получает только то, что буферизовано во время запуска процесса.Это может не содержать строку, содержащую порт.Но, поскольку я передаю стандартный поток вывода, это также блокирует оболочку вызывающей стороны.

process = subprocess.Popen(['python', 'server.py'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

if process.stdout:
    for line in process.stdout.readline():
        print(line)    

Как получить порт из возвращаемого процесса, а не заблокировать вызывающий процесс?

1 Ответ

0 голосов
/ 02 февраля 2019

Весь этот ответ кажется немного грязным, но, тем не менее, он работает:

server.py:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def call_method():
    return 'Hello'

if __name__ == '__main__':
    app.run()

run.py:

import subprocess
p = subprocess.Popen(['python', 'server.py'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

flask_start_string = ''

while True:
    flask_start_string += p.stdout.readline().decode('utf-8')
    if '(Press CTRL+C to quit)' in flask_start_string:
        port = flask_start_string.split(' * Running on http://127.0.0.1:')[1].split('/ (Press CTRL+C to quit)')[0]
        break

print(port)

python run.py печатает номер порта и поддерживает работу сервера в фоновом режиме.Работает как на Windows, так и на Linux.

...