Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从在子进程Popen进程中运行的flask localhost应用程序获取端口_Python_Flask_Subprocess_Tcp Port - Fatal编程技术网

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

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

我正在本地主机上从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__ == '__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上工作