вызвать скрипт python из flask_restful - PullRequest
0 голосов
/ 13 июня 2018

Я хотел бы вызвать скрипт python с помощью flask_restful, и я щелкнул по ссылке ниже, чтобы реализовать https://dev.to/aaahmedaa/create-restapi-for-your-python-scripts-using-flask-with-15-line-of-code-10ml

Я выполняю команду python app.py из командной строки и передаю изображение в качестве ввода из браузера, как показано ниже http://localhost:5000/ImageClassification/image1.jpg

Я получаю вывод в виде {"data": null}

Предполагается, что для получения вывода, как показано ниже из скрипта cnn_classification.py, пожалуйста, сообщите мне, где я допустил ошибку.

cnn_classification.py:

    import os
    import subprocess
    os.getcwd()
    os.chdir("D:/LH_data/LH_tensorflow/tensorflow-for-poets-2/")

    def lh_image_classification(input_image):
        subprocess.call(['python', '-m', 'scripts.label_image', '--graph=tf_files/optimized_graph.pb', '--image=' + input_image])

app.py:

    import cnn_classification
    from flask import Flask, request
    from flask_restful import Resource, Api
    from sys import argv

    app = Flask(__name__)
    api = Api(app)

    #input_image = argv[1]
    class imageClassification(Resource):
          def get(self, input_image):
              return {'data': cnn_classification.lh_image_classification(input_image)}

    api.add_resource(imageClassification, '/ImageClassification/<input_image>')

    if __name__ == '__main__':
         app.run()

1 Ответ

0 голосов
/ 14 июня 2018

Вы не должны вызывать подпроцесс так, как вы делаете это наиболее фундаментально, потому что вы создаете дыру в безопасности.Команду можно передать конечной точке, которую вы описываете, сделав вызов конечной точки с чем-то вроде /ImageClassification/image.png;sudo rm -rf / или хуже.

Для начала используйте сценарий вместо подпроцесса.Детали зависят от того, что находится внутри scripts.label_image, но я думаю, это должно выглядеть примерно так:

import scripts.label_image
from flask import Flask, request
from flask_restful import Resource, Api

app = Flask(__name__)
api = Api(app)

class ImageClassification(Resource):
    def get(self, input_image):
        result = label_image(
            graph="tf_files/optimized_graph.pb",
            image=input_image
        )
        return {'data': result}

api.add_resource(ImageClassification, '/ImageClassification/<input_image>')

if __name__ == '__main__':
     app.run()

. Это предполагает, что скрипт label_image является функцией вида

def label_image(graph, image):
    #... does stuff
    return result

Youможет потребоваться переместить некоторые данные из "D:/LH_data/LH_tensorflow/tensorflow-for-poets-2/" в папку вашего проекта, чтобы иметь возможность импортировать их в приложение фляги.

...