从在子进程Popen进程中运行的Flask localhost应用程序获取端口

时间:2019-02-01 15:06:07

标签: python flask subprocess tcp-port

我正在从子进程.Popen进程中的本地主机上运行Flask服务器。

我想知道在此过程中分配给烧瓶服务器的端口是什么,而不会阻止调用过程。然后,我将使用localhost:port与烧瓶应用程序进行通讯。

这是server.py:

# server.py

import Flask


app = Flask(__name__)


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


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

选项1:将端口打印到stdout,但是我无法以编程方式访问它。另外,阻止呼叫过程

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

选项2:捕获标准输出,但仅获取启动进程时缓冲的内容。这可能不包含包含端口的行。但是,由于我正在使用stdout,这也会阻塞调用程序外壳。

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 :(得分:0)

这整个答案有点脏,但仍然有效:

server.py:

read_result

run.py:

from flask import Flask

app = Flask(__name__)

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

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

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) 打印端口号并使服务器在后台运行。它可以在Windows和Linux上运行。