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

标签 python powershell flask ubuntu-17.04

我试图通过传递一个变量并触发它来响应对 Flask/Python API 的 Web 调用,从而在 Linux 的 Powershell 中调用 .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)

它没有做任何事情。 Flask 调试给我错误:

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

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

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

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

最佳答案

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

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

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

关于python - 从 Python 中的 Flask 路由调用 Linux Powershell 中的 .ps1 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50456993/

相关文章:

python - Project Euler #4 算法的可能优化

powershell - start-job 并行运行命令并在结果到达时输出结果

python - 在 flask 上是否有效?

python - 从下拉列表中的数据库 mysql 中选择条目,python Flask

python - 预期的 LP_c_float 实例而不是 glVertex3fv 中的元组

python - django.db.migrations.exceptions.InconsistentMigrationHistory

python - Tensorflow:如何找到 tf.data.Dataset API 对象的大小

powershell - 使用 Get-AzureStorageBlobContent 从 Azure 下载 - 内容出现乱码

powershell - 循环内的函数 - powershell

python - 导入错误 : No module named psycopg2 after install