Получить порт из приложения на локальном хосте 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.