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

时间:2018-05-21 21:44:57

标签: python powershell flask ubuntu-17.04

我尝试在Powershell for Linux中调用.ps1脚本,方法是传递变量并触发它以响应对Flask / Python API的Web调用。

此示例中的所有文件都在同一目录中 - 理想情况下,.ps1脚本和其需要执行的操作的其他相关文件将位于另一个目录中,但为了进行测试,它们全部位于主目录中我的目录。

如果我通过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可执行文件的路径,但这显然不是它在这里的工作方式。

一个注释是上面的变量 - 我已经尝试过了,只是让值通过var1传递给GET,然后忽略它并硬编码arg1进行测试,没有区别。真正的代码确实需要变量。

我在这里做错了任何明显的愚蠢行为?虽然有一些类似的Windows问题,但似乎没有人要求Linux提出这个问题。

1 个答案:

答案 0 :(得分:1)

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

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

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