首页 > 解决方案 > 从 Flask API 调用 shell 脚本

问题描述

API 构建真的很新 -

我正在尝试构建一个从 HTTP 请求中获取参数的 API。到目前为止,我能够启动烧瓶 API 服务器,我已将我的脚本放在同一个文件夹中。不过,当我调用 HTTP URL 时,它给了我以下错误:

FileNotFoundError: [Errno 2] No such file or directory: './bdp_scheduler_change -q queue -v vcores -s "api" -o "overwrite"': './bdp_scheduler_change -q queue -v vcores -s "api" -o "overwrite"'

这是我的代码:

import subprocess
import shlex
import flask
from flask import request, jsonify

app = flask.Flask(__name__)
app.config["DEBUG"] = True

@app.route('/', methods=['GET'])
def home():
    return '''<h1>Shell Run</h1>
<p>An API Call To shell</p>'''


@app.route('/api/v1/bdpaas/resources/', methods=['GET'])
def api_filter():

    query_parameters = request.args

    queue = query_parameters.get('queue')
    vcores = query_parameters.get('vcores')
    subprocess.call(['./bdp_scheduler_change -q queue -v vcores -s "api" -o "overwrite"'])

if __name__=='__main__':
        app.run(host='server.mydom.com', debug=True)


像运行我的代码 -

python3.6 test_api.py

[ngupta@server:/home/mapr/nishantypython] python3.6 test_api.py
 * Serving Flask app "test_api" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://server.mydom.com:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 266-911-173
10.96.5.176 - - [07/Jul/2020 04:57:29] "GET //api/v1/bdpaas/resources/ HTTP/1.1" 500 -
Traceback (most recent call last):
  File "/usr/local/lib64/python3.6/site-packages/flask/app.py", line 2464, in __call__
    return self.wsgi_app(environ, start_response)
  File "/usr/local/lib64/python3.6/site-packages/flask/app.py", line 2450, in wsgi_app
    response = self.handle_exception(e)
  File "/usr/local/lib64/python3.6/site-packages/flask/app.py", line 1867, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib64/python3.6/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/usr/local/lib64/python3.6/site-packages/flask/app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib64/python3.6/site-packages/flask/app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib64/python3.6/site-packages/flask/app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib64/python3.6/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/usr/local/lib64/python3.6/site-packages/flask/app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib64/python3.6/site-packages/flask/app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/mapr/nishantypython/test_api.py", line 47, in api_filter
    subprocess.call(['./bdp_scheduler_change -q queue -v vcores -s "api" -o "overwrite"'])
  File "/usr/lib64/python3.6/subprocess.py", line 287, in call
    with Popen(*popenargs, **kwargs) as p:
  File "/usr/lib64/python3.6/subprocess.py", line 729, in __init__
    restore_signals, start_new_session)
  File "/usr/lib64/python3.6/subprocess.py", line 1364, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: './bdp_scheduler_change -q queue -v vcores -s "api" -o "overwrite"': './bdp_scheduler_change -q queue -v vcores -s "api" -o "overwrite"'


URL - http://server.mydom.com:5000/api/v1/bdpaas/resources/

任何帮助表示赞赏。我可能对这个概念完全错误,如果是这种情况,请指导我。

标签: pythonapishellflaskpython-3.6

解决方案


尝试而不是写./来执行你的脚本,然后写sh一个空格。

subprocess.call(['sh bdp_scheduler_change -q queue -v vcores -s "api" -o "overwrite"'])

推荐阅读