我试图在PowerShellforLinux中调用一个.ps1脚本,通过传递一个变量并触发它来响应对flask/python API的Web调用。
在本例中,所有文件都在同一个目录中—理想情况下,.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
通过
GET
然后忽略它并硬编码
arg1
去测试,没什么区别。真正的代码确实需要变量。
有什么明显的愚蠢的事情我做错了吗?这个问题似乎没有被问到Linux,尽管有一些类似的Windows问题。