运行 来自 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"]
我在文件 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"]