【问题标题】:Calling a .ps1 script in Linux Powershell from a Flask route in Python从 Python 中的 Flask 路由调用 Linux Powershell 中的 .ps1 脚本
【发布时间】:2018-10-31 14:11:12
【问题描述】:

我正在尝试通过传递一个变量并触发它来响应对 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 可执行文件的路径放在命令中,但这显然不是这里的工作方式。

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

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

【问题讨论】:

  • but that's obviously not how it works here 为什么不呢?完整路径/usr/whatev/pwsh
  • 大声笑好吧,我是个白痴。在使用which pwsh 确定二进制文件的路径是/usr/bin/pwsh 后,我只是按照说明更改了该部分并且它可以工作。我相信二进制文件需要在您的$PATH 中才能正常工作,但这些场景的其他信息可在:askubuntu.com/questions/49024/… 找到直接路径。抱歉,我不得不在 linux 中为已经在 $PATH 中的命令声明路径,我什至没有意识到在这种情况下这是一个选项。
  • 如果您希望我接受,请复制/粘贴到答案中,谢谢您,TheIncorrigible

标签: python powershell flask ubuntu-17.04


【解决方案1】:

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

subprocess.run(['/usr/bin/pwsh', '.\example.ps1', arg1, arg2])

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

【讨论】:

    猜你喜欢
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-03
    • 2011-10-17
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    相关资源
    最近更新 更多