2

我在 subprocess.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:将端口打印到标准输出,但我无法以编程方式访问它。此外,阻止调用过程

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)    

如何从返回的进程中获取端口,而不阻塞调用进程?

4

1 回答 1

0

整个答案感觉有点脏,但它仍然有效:

服务器.py:

from flask import Flask

app = Flask(__name__)

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

if __name__ == '__main__':
    app.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。

于 2019-02-01T21:17:08.033 回答