Flask 在 运行 使用 docker 时停在 OptionParser.parse_args()
Flask stops at OptionParser.parse_args() when running it using docker
我正在使用 flask 创建一个 Rest API,它会加载一个预训练模型,呈现图形主页,然后获取一些输入目录以将数据提供给分类。
当我 运行 在本地机器上运行代码时,一切正常。但是当我使用 docker 到 运行 app.py 文件(API 所在的位置并加载经过训练的模型)时,它会卡在 OptionParser.parse_args()。有什么办法可以解决这个问题并继续使用 optparse?这是我的代码的样子。
app.py:
from flask import Flask, request, jsonify, render_template, redirect, url_for
import os
import sys
sys.path.insert(0, '/docker_dir_to_project/')
sys.path.insert(0, '/docker_dir_to_project/deploy')
import model_backend
from optparse import OptionParser
app = Flask(__name__)
print('\n\n\n\nopened flask app\n\n\n')
# some initialization, here I just load the config and load the model
class my_app:
def __init__(self):
# some directories
print('init')
self.deploy_dir = os.path.dirname(os.path.abspath(__file__))
# it gets stuck in this method:
self.opt = self._create_options()
print('2')
# building the model, optparse is used in this method again.
self.recognizer = model_backend.classifier(self.opt,self.device)
# uses option parser, and it gets stuck here
def _create_options(self):
parser = OptionParser()
print('11') # will be printed
print('12') # will be printed
(opt, args) = parser.parse_args() # with docker it gets stuck here,
print('13') # won't be printed
opt.some_settings = some_settings
return opt
# the rest of a normal flask application
print('BEFORE INIT')
recognizer_system_ = my_app()
print('after init')
# the api
@app.route('/', methods=['GET', 'POST'])
def Main_page():
print('main page')
return render_template('Main_page.html')
# this file is not run
if __name__ == '__main__':
print('\n\n\nmain file in app\n\n\n')
app.run(host='0.0.0.0')
docker文件如下:
FROM python:3.7
#
RUN apt-get update
ADD all_required_files /all_required_files_on_docker
ENV FLASK_DEBUG=1
WORKDIR /docker_dir_to_project/deploy
CMD [ "flask", "run", "--host=0.0.0.0"]
我用sudo bash命令运行得到的bash文件如下:
dockerize.sh:
#!/bin/bash
docker build -f ./deploy/Dockerfile -t sr .
docker run -p 5000:5000 sr
当我 运行 通常在本地主机上时(没有 docker),它工作正常。但是当我使用dockerize.sh脚本时,它无法加载主页,控制台输出如下:
Usage: flask [options]
flask: error: no such option: --host
opened flask app
BEFORE INIT
init
11
12
这意味着,它卡在 app.py -> my_app -> _create_options -> (opt, args) = parser.parse_args()
有人知道如何解决吗?我稍后在模型中使用 optparse 来加载参数,如果可能的话,我更愿意继续使用它。预先感谢大家的宝贵时间。
我可以通过使用 argparse 包而不是 optparse 来解决这个问题,并替换
parser = OptionParser()
(opt, args) = parser.parse_args()
和
parser = argparse.ArgumentParser()
opt, _ = parser.parse_known_args()
我正在使用 flask 创建一个 Rest API,它会加载一个预训练模型,呈现图形主页,然后获取一些输入目录以将数据提供给分类。
当我 运行 在本地机器上运行代码时,一切正常。但是当我使用 docker 到 运行 app.py 文件(API 所在的位置并加载经过训练的模型)时,它会卡在 OptionParser.parse_args()。有什么办法可以解决这个问题并继续使用 optparse?这是我的代码的样子。
app.py:
from flask import Flask, request, jsonify, render_template, redirect, url_for
import os
import sys
sys.path.insert(0, '/docker_dir_to_project/')
sys.path.insert(0, '/docker_dir_to_project/deploy')
import model_backend
from optparse import OptionParser
app = Flask(__name__)
print('\n\n\n\nopened flask app\n\n\n')
# some initialization, here I just load the config and load the model
class my_app:
def __init__(self):
# some directories
print('init')
self.deploy_dir = os.path.dirname(os.path.abspath(__file__))
# it gets stuck in this method:
self.opt = self._create_options()
print('2')
# building the model, optparse is used in this method again.
self.recognizer = model_backend.classifier(self.opt,self.device)
# uses option parser, and it gets stuck here
def _create_options(self):
parser = OptionParser()
print('11') # will be printed
print('12') # will be printed
(opt, args) = parser.parse_args() # with docker it gets stuck here,
print('13') # won't be printed
opt.some_settings = some_settings
return opt
# the rest of a normal flask application
print('BEFORE INIT')
recognizer_system_ = my_app()
print('after init')
# the api
@app.route('/', methods=['GET', 'POST'])
def Main_page():
print('main page')
return render_template('Main_page.html')
# this file is not run
if __name__ == '__main__':
print('\n\n\nmain file in app\n\n\n')
app.run(host='0.0.0.0')
docker文件如下:
FROM python:3.7
#
RUN apt-get update
ADD all_required_files /all_required_files_on_docker
ENV FLASK_DEBUG=1
WORKDIR /docker_dir_to_project/deploy
CMD [ "flask", "run", "--host=0.0.0.0"]
我用sudo bash命令运行得到的bash文件如下:
dockerize.sh:
#!/bin/bash
docker build -f ./deploy/Dockerfile -t sr .
docker run -p 5000:5000 sr
当我 运行 通常在本地主机上时(没有 docker),它工作正常。但是当我使用dockerize.sh脚本时,它无法加载主页,控制台输出如下:
Usage: flask [options]
flask: error: no such option: --host
opened flask app
BEFORE INIT
init
11
12
这意味着,它卡在 app.py -> my_app -> _create_options -> (opt, args) = parser.parse_args()
有人知道如何解决吗?我稍后在模型中使用 optparse 来加载参数,如果可能的话,我更愿意继续使用它。预先感谢大家的宝贵时间。
我可以通过使用 argparse 包而不是 optparse 来解决这个问题,并替换
parser = OptionParser()
(opt, args) = parser.parse_args()
和
parser = argparse.ArgumentParser()
opt, _ = parser.parse_known_args()