python - 如何从 Flask App 执行 Shell 脚本
问题描述
我已经创建并部署了一个带有 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 命令?
解决方案
要在 Python 中显示命令输出,有两种流行的方法:
check_output()
:它使用参数运行命令并返回其输出。(官方文档)subprocess.communicate()
:与进程交互:将数据发送到标准输入。从 stdout 和 stderr 读取数据,直到到达文件结尾。(官方文档)
我可以在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"
输出截图:
推荐阅读
- python - InvalidArgumentError:reshape 的输入是一个值为 0 的张量,但请求的形状有 54912
- microsoft-edge - IE 在 Edge IE 模式下添加
- c# - 如何使 PictureBox 的透明度在另一个 PictureBox 上方时正常工作?
- r - 基于数据子集绘制椭圆
- material-ui - 删除未使用的 makeStyles 属性
- python-3.x - 如何将字符串从字典中转换为它的值对?
- format - Power BI Desktop 更改数字的计数格式
- json - 如何在Angular中将数组项添加到导入的模型(接口)
- java - Java 接口在 Spring Boot 中的工作方式是否不同?-- 这是 Spring Wizardry 还是我只是不懂接口?
- python - PyQt5 OpenCV 网络摄像头使用 QThread