从 Python 中的 Flask 路由调用 Linux Powershell 中的 .ps1 脚本

Calling a .ps1 script in Linux Powershell from a Flask route in Python

我正在尝试通过传递一个变量并触发它以响应对 Flask/Python API.

在此示例中,所有文件都位于同一目录中 - 理想情况下,.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)

它什么也没做。 Flask 调试给我错误:

Exception: builtins.FileNotFoundError: [Errno 2] No such file or directory: 'pwsh'

这让我觉得它没有找到 pwsh 的二进制文件,但我不清楚在这种情况下如何解决这个问题。在 Windows 中,您会在命令中放置 powershell.exe 可执行文件的路径,但显然这不是这里的工作方式。

一个注意事项是上面的变量——我试过没有,只是让一个值通过 GET 传递给 var1 然后忽略它并硬编码 arg1 来测试,没有区别。真正的代码确实需要变量。

我在这里做错了什么明显的蠢事吗? Linux 似乎没有人问过这个问题,尽管有一些类似的 Windows 问题。

在 Windows 中,如果您不确定环境变量,通常最佳做法是为您的可执行文件和参数设置完整路径。您可以在示例中使用

来完成此操作
subprocess.run(['/usr/bin/pwsh', '.\example.ps1', arg1, arg2])

完全限定 Linux 中的 pwsh 可执行文件路径。