我在文件 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
我正在尝试做的事情可能吗?我错过了什么?我有点迷失了:(
谢谢。
答案 0 :(得分:1)
好的,我可以告诉你如何解决这个问题。如果您查看回溯,flask
会调用一个名为 werkzeug
的包来完成这项工作。 werkzeug
在必须创建套接字时在环境中放置一个注释,大概是为了它可以在 fork 中重用该套接字。在您的情况下,第二个进程继承了该环境,因此它认为 fd
已存在并尝试重用它,但此进程中不存在 fd
。
应该有效的丑陋解决方案是在启动端口 8080(或 2226,基于原始回溯;)之前将其添加到您的第二个脚本中:
del os.environ["WERKZEUG_SERVER_FD"]