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

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

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

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

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.

Другие вопросы по тегам