如何从Flask App执行Shell脚本

时间:2018-11-19 18:57:18

标签: python bash shell flask

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

这是test.sh:

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

这是我的python flask应用程序代码index.py(在打开App时运行),但未打印或执行任何操作:

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

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

# 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命令?

1 个答案:

答案 0 :(得分:2)

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

  1. check_output():它运行带有参数的命令并返回其输出。 (official documentation)
  2. subprocess.communicate():与进程交互:将数据发送到stdin。从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 = subprocess.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"

输出屏幕截图:

enter image description here