运行 来自 flask 路由的服务器

Run a server from a flask route

我在文件 1 中有一个烧瓶服务器 (app1):

from flask import Flask
app1 = Flask(__name__)

@app1.route('/', methods=['POST']):
    return "Hello!"

if __name__ == '__main__':
    app1.run(port=8080, debug=True)

另一个 flask 服务器(app2)在 file2 中:

import os
from flask import Flask, request
import subprocess
from time import sleep

app2 = Flask(__name__)

@app2.route('/run-path', methods=['POST'])
def run_path():
    command_str = request.json.get('command')
    command = command_str.split()
    path_to_add = command[1]
    os.environ['PYTHONPATH'] += f":{path_to_add}" # Adding the file that's going to be ran 
    # to PYTHONPATH to prevent import errors 
    
    subprocess.run(
        command,
        env=os.enivron.copy(),
        stdin=subprocess.PIPE,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
    )
    sleep(600)

if __name__ == '__main__':
    app2.run(port=2222, debug=True)

当有人向app2(端口2222)发送请求时,它应该运行一个python命令,这有时是一个flask服务器。问题是尝试使用 subprocess.run.

运行 此命令时出现任何问题

似乎可行,但是当我尝试向 app1(我们尝试使用子进程启动的服务器)发送请求时,没有任何响应。 服务器基本上已关闭,命令似乎什么也没做。

如果我将标准输出设置为 subprocess.STDOUT,我会得到这个异常:

Traceback (most recent call last):
  File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py", line 1758, in <module>
    main()
  File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py", line 1752, in main
    globals = debugger.run(setup['file'], None, None, is_module)
  File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py", line 1147, in run
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "/Applications/PyCharm CE.app/Contents/helpers/pydev/_pydev_imps/_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "/Users/galshahar/Desktop/Projects/PychramProjects/cba/src/api.py", line 48, in <module>
    app.run(port=8080, debug=True)
  File "/Users/galshahar/anaconda3/lib/python3.7/site-packages/flask/app.py", line 943, in run
    run_simple(host, port, self, **options)
  File "/Users/galshahar/anaconda3/lib/python3.7/site-packages/werkzeug/serving.py", line 814, in run_simple
    inner()
  File "/Users/galshahar/anaconda3/lib/python3.7/site-packages/werkzeug/serving.py", line 774, in inner
    fd=fd)
  File "/Users/galshahar/anaconda3/lib/python3.7/site-packages/werkzeug/serving.py", line 660, in make_server
    passthrough_errors, ssl_context, fd=fd)
  File "/Users/galshahar/anaconda3/lib/python3.7/site-packages/werkzeug/serving.py", line 574, in __init__
    socket.SOCK_STREAM)
  File "/Users/galshahar/anaconda3/lib/python3.7/socket.py", line 463, in fromfd
    nfd = dup(fd)
OSError: [Errno 9] Bad file descriptor

我想做的事情可行吗?我错过了什么?我有点迷路:(

谢谢。

好的,我可以告诉你如何解决它。如果您查看回溯,flask 会调用一个名为 werkzeug 的包来完成这项工作。 werkzeug 在必须创建套接字时在环境中添加一条注释,大概是这样它就可以在 fork 中重用该套接字。在您的情况下,第二个进程继承了该环境,因此它认为 fd 已经存在并尝试重用它,但是 fd 在此进程中不存在。

应该可行的丑陋解决方案是在启动端口 8080(或 2226,基于原始回溯;)之前将其添加到第二个脚本中;

    del os.environ["WERKZEUG_SERVER_FD"]