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()