从烧瓶路线运行服务器

时间:2021-03-16 23:56:55

标签: python flask subprocess

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

from flask import Flask
app1 = Flask(__name__)

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

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

文件2中的另一个flask服务器(app2):

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(我们尝试从子进程启动的服务器)发送请求时,没有响应。 服务器基本上已关闭,该命令似乎什么也没做。

如果我将 stdout 设置为 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

我正在尝试做的事情可能吗?我错过了什么?我有点迷失了:(

谢谢。

1 个答案:

答案 0 :(得分:1)

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

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

    del os.environ["WERKZEUG_SERVER_FD"]