Python 从在子进程Popen进程中运行的flask localhost应用程序获取端口
我正在本地主机上从subprocess.Popen进程运行flask服务器 我想知道在这个过程中为flask服务器分配了什么端口,而不阻塞调用过程。然后,我将使用localhost:port与flask应用程序对话 这是server.py:Python 从在子进程Popen进程中运行的flask localhost应用程序获取端口,python,flask,subprocess,tcp-port,Python,Flask,Subprocess,Tcp Port,我正在本地主机上从subprocess.Popen进程运行flask服务器 我想知道在这个过程中为flask服务器分配了什么端口,而不阻塞调用过程。然后,我将使用localhost:port与flask应用程序对话 这是server.py: # server.py import Flask app = Flask(__name__) @app.route('/') def call_method(): return 'Hello' if __name__ == '__mai
# server.py
import Flask
app = Flask(__name__)
@app.route('/')
def call_method():
return 'Hello'
if __name__ == '__main__':
app.run()
from flask 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:捕获标准输出,但只获取启动进程时缓冲的内容。这可能不包含包含端口的行。但是,由于我是管道stdout,这也会阻止调用程序shell
process = subprocess.Popen(['python', 'server.py'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
if process.stdout:
for line in process.stdout.readline():
print(line)
如何从返回的进程中获取端口,而不阻止调用进程?整个答案感觉有点脏,但仍然有效: server.py:
# server.py
import Flask
app = Flask(__name__)
@app.route('/')
def call_method():
return 'Hello'
if __name__ == '__main__':
app.run()
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上工作