python - 从 Python 中的 Flask 路由调用 Linux Powershell 中的 .ps1 脚本
问题描述
我试图通过传递一个变量并触发它来响应对 Flask/Python API 的 Web 调用,从而在 Powershell for Linux 中调用 .ps1 脚本。
在此示例中,所有文件都位于同一目录中 - 理想情况下,.ps1 脚本和它需要采取的操作的其他相关文件将位于另一个目录中,但为了测试,它们都在我的 venv 的主目录中。
如果我手动运行以下代码,通过my_venv >> python script.py
# this is script.py
import subprocess
arg1 = 'xyz'
arg2 = 'abc'
subprocess.run(['pwsh', '.\example.ps1', arg1, arg2])
它会正常工作。Powershell 将运行,并且脚本中的操作 example.ps1
将执行。但是,如果我将相同的 Python 代码添加到 Flask 应用程序路由,则它可以由 API 请求触发,如下所示:
from flask import Flask, request
import subprocess
app = Flask(__name__)
app.debug = True
# example route
@app.route('/example/', methods=['GET'])
def example():
var1 = request.args.get('var1')
arg1 = var1
arg2 = 'abc'
subprocess.run(['pwsh', '.\example.ps1', arg1, arg2])
return ('success', 200)
它什么也没做。烧瓶调试给了我错误:
Exception: builtins.FileNotFoundError: [Errno 2] No such file or directory: 'pwsh'
这让我觉得它没有找到二进制文件,pwsh
但我不清楚在这种情况下如何解决这个问题。在 Windows 中,您可以将 powershell.exe 可执行文件的路径放在命令中,但这显然不是这里的工作方式。
一个注意事项是上面的变量 - 我没有尝试过,只是让一个值传递给var1
viaGET
然后忽略它并硬编码arg1
来测试,没有区别。真正的代码确实需要这个变量。
我在这里做错了什么明显的愚蠢的事情吗?尽管有一些类似的 Windows 问题,但似乎没有针对 Linux 提出过这个问题。
解决方案
在 Windows 中,如果您不确定环境变量,通常最好的做法是完全路径您的可执行文件和参数。您可以在示例中使用
subprocess.run(['/usr/bin/pwsh', '.\example.ps1', arg1, arg2])
完全限定 Linux 中的 pwsh 可执行路径。
推荐阅读
- c# - 如何读取其他显示器像素的颜色
- javascript - 努力在 for 循环中构建表格
- swift - Swift JSONEncoder.dataCodingStrategy 自定义函数未被调用
- node.js - 如何在 express.js 中创建注册路由?
- android-studio - 我无法在 Android Studio 中选择 AVD 设备
- jquery - 纠正我们在 jQuery 中的“每个”
- python - 使用 python-openCV 读取视频并保存为 pgm 格式的图像
- c# - 实现所有实现的接口
- c++ - 使用分隔符拆分文本?
- javascript - 对数据库的异步请求问题