如何从 Flask App 执行 Shell 脚本 [重复]

Posted

技术标签:

【中文标题】如何从 Flask App 执行 Shell 脚本 [重复]【英文标题】:How to execute Shell Script from Flask App [duplicate] 【发布时间】:2019-04-22 04:30:47 【问题描述】:

我已经创建并部署了一个带有 Apache2 服务器 WSGI 的 Flask 应用程序,现在想从该应用程序运行一个 .sh 脚本。但是,从 python 代码调用,它不会执行。

这里是 test.sh:

#!/bin/bash
echo "hi from shell script"

这是我的 python 烧瓶应用程序代码 index.py(在打开应用程序时运行)但没有打印或执行:

import subprocess
subprocess.call('/var/www/FlaskApp/FlaskApp/scripts/test.sh')

为了检查我的代码中没有错误,我检查了烧瓶错误日志,没有错误。另外,我创建了一个名为 test_shell_script.py 的脚本,其 python 代码与上面相同(但不是烧瓶应用程序代码),它运行得很好:

# test_shell_script.py
import subprocess
subprocess.call('/var/www/FlaskApp/FlaskApp/scripts/test.sh')

然后用python运行它: python3 /var/www/FlaskApp/FlaskApp/test_shell_script.py

hi from shell script

我也更改了权限:

-rwxr-xr-x 1 root root 364 Nov 19 17:48 ../scripts/test.sh

我在这里遗漏了什么不允许我的 Flask 应用程序从 python 代码运行 shell 命令?

【问题讨论】:

你得到什么样的错误?这看起来很相似:***.com/questions/4256107/…,你可以试试subprocess.Popen 的建议吗? 接收没有错误。我试过 subprocess.Popen 甚至 os.system 您授予文件run_sql.sh的root权限,但您尝试运行的文件名是test.sh @Seraf - 抱歉打错了,现在改正 奇怪,运行 Flask 应用程序的用户是 root? (可能是,但仍在询问) 【参考方案1】:

要在 Python 中显示命令输出,有两种流行的方法:

    check_output():它运行带有参数的命令并返回其输出。 (official documentation) subprocess.communicate():与进程交互:将数据发送到标准输入。从 stdout 和 stderr 读取数据,直到到达文件结尾。 (official documentation)

我可以在 Ubuntu 机器上使用 Python 3.5 两种方法查看 shell 文件输出。

app.py:

import subprocess
from subprocess import Popen, PIPE
from subprocess import check_output
from flask import Flask

def get_shell_script_output_using_communicate():
    session = Popen(['./some.sh'], stdout=PIPE, stderr=PIPE)
    stdout, stderr = session.communicate()
    if stderr:
        raise Exception("Error "+str(stderr))
    return stdout.decode('utf-8')

def get_shell_script_output_using_check_output():
    stdout = check_output(['./some.sh']).decode('utf-8')
    return stdout

app = Flask(__name__)

@app.route('/',methods=['GET',])
def home():
    return '<pre>'+get_shell_script_output_using_check_output()+'</pre>'

app.run(debug=True)

some.sh:

#!/bin/bash
echo "hi from shell script"
echo "hello from shell script"

输出截图:

【讨论】:

get_shell_script_output_using_communicate()stderr也需要使用raise Exception("Error "+str(stderr.decode('utf-8')))解码

以上是关于如何从 Flask App 执行 Shell 脚本 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

python flask框架 app.debug=True时,启动脚本被执行了2次

python flask框架 app.debug=True时,启动脚本被执行了2次

Flask(Flask_脚本项目重构)

使用 Flask 执行 python 脚本 [重复]

如何从shell脚本在Intersystem缓存上执行某些命令?

Shell 脚本:从 shell 脚本中执行 python 程序